İçeriğe geç →

C# ile Asenkron Socket Programlama

Merhaba arkadaşlar, bu makalemde sizlerle her ne kadar kimine göre eskide kalmış olsa da hala birçok yerde aktif olarak kullanılan soket programlama üzerine bir örnek vermeye çalışacağım.

Öncelikle soket programlama nedir?

Socket-Workflow

Soketler için istemci (Client) ve sunucu (Server) arasındaki bağlantının sağlanması için olan bir iletişim kanalı diyebiliriz. Yaşam döngüsünü basitçe tarif etmek gerekirse, sunucu önceden belirlenen portu dinler, istemci ise bu porta mesaj gönderir.

İletişim protokolü olarak TCP de sunucu belirli bir portu dinleyerek gelen istekleri karşılar, UDP protokolü ise tek bir soket üzerinden birden çok istemciye veriyi iletebilir. Unutulmamalıdır ki UDP protokolünü kullanmaya karar vermiş biri meydana gelebilecek paket kayıplarınıda göze alıp, bunları iyi handle etmelidir. Bunu en büyük örneği VOIP sistemlerinde ses paketlerinin zaman zaman kayıplara uğramasıdır. “Fire and forget” mantığında çalışmaktadır.

Nerelerde kullanılıyor?

Bu makaleyi yazma sebebimden yola çıkarak çalıştığım firmada yoğun servis verileri ile çalışmaktayız ve ilgili domainimiz oldukça IIS’i yormaktaydı. Servis makinelerini 4 farklı sunucuya bölüp, IIS üzerinde bir load balancer (Gelecek makale konularımdan birisi c# ile load balancer geliştirme dağıtık mimariler üzerinde) geliştirerek müsait olan sunucuya ilgili transfer objelerimizi soket aracılığı ile bu sunuculara aktararak IIS üzerinden ilgili servis verilerinin business logic yükünden kurtarmış olduk.

Bir başka örnek vermek gerekirse gerçek zamanlı uygulamalar, örneğin chat veya bazı pos cihazları da örnek olarak gösterilebilir.

Şimdi örneğimize önce soket aracılığı ile aktarılacak olan nesnelerimiz için ilgili DataTransferObjects katmanımızı bir solution oluşturarak içerisinde oluşturalım ve ExampleDTO sınıfını tanımlayalım.

Oluşturduktan sonra kodlamaya sunucu ile devam edelim. Solution içine yeni bir console application projesi ekleyip ExampleServer adını veriyoruz. İçerisine Sockets isminde bir klasör oluşturup Client.cs sınıfını ekliyoruz.

Sunucu için istemci işlemlerini gerçekleştireceğimiz sınıfı ekledikten sonra Sockets klasörü içerisine asıl dinleme işlemini yapacağımız sınıf olan Listener.cs sınıfını ekliyoruz ve kod içeriği aşağıdaki gibidir.

Dinleme işlemini yapacağımız Listener sınıfı bittiğine göre şimdi console uygulamamızın Program.cs sınıfının Main metodunda dinleme işlemine başlayalım.

Evet böylelikle 5555 portundan gelecek olan bağlantıları dinleyip işleyecek bir sunucuya sahip olduk. Şimdi istemciyi kodlamaya başlayabiliriz.

Solution üzerine ExampleClient isminde bir console application ekleyelim ve ardından içerisine Sockets isimli bir klasör ekleyip ExampleSocket.cs sınıfımızı tanımlamaya başlayalım.

İstemcimiz için soketi hazırladığımıza göre şimdi gelelim konsol uygulamamızın Program.cs sınıfında Main metodunda gerekli bağlanma işlemlerini ve gönderme işlemlerini gerçekleştireceğimiz kodları yazalım.

İstemcimizde sunucuya bağlanmak için hazır durumda, tek yapmamız gereken göndermek için G tuşuna basmak.

Ekran çıktısı.

socket-test

 

Not: ExampleDataTransferObjects kütüphanesini istemci ve sunucu tarafında referans göstermeyi unutmayınız. 🙂

Kaynak kodu ekte bulabilirsiniz.

SocketProgrammingExample

 

Bu makale toplam (15775) kez okunmuştur.

28
2



Kategori: .NET

9 Yorum

  1. halil ibrahim şeker halil ibrahim şeker

    Paylaşım için çok teşekkürler.

  2. atakan savaş atakan savaş

    Selamlar.
    Bu yapıyı kullanarak server ve client arasında büyük veriler göndermek problem yaşatır mı? ayrıca ağı dinleyen programlar için ne kadar güvenli bu yöntem?

    • Merhaba, limit olarak herhangi bir limit bulunmamakta sadece buffer’ın aşılmamasına dikkat etmeniz gerekmektedir. https://msdn.microsoft.com/en-us/library/ms145160.aspx adresindeki notlar’ın bulunduğu kısımda okuyabilirsiniz. “You must ensure that the size of your buffer does not exceed the maximum packet size of the underlying service provider.” Ayrıca arp poisoning’e gelince herhangi biri server ağınıza ulaşıp o ağ üzerinde sniff işlemi yaparsa elbette dinlenebilir. Buda sizin mimari olarak hatanızı göstermektedir.

  3. Hocam merhaba, online oyun için socket oluşturma çabası içerisindeyiz 🙂 Birde bunun multi-thread örneğini yayınlayabilir misiniz?

  4. ali ali

    maxsimum client sayısı nedir? belli bir sayıdan sonra saçmalar mı?

    • Merhaba, maksimum client sayısına ortalama bir şey söylemek yanlış olur. Concurrent olarak gerçekleştireceğiz işlemlere, bu uygulamayı host edecek olan server’ın kapasitesine ve aynı zamanda network’e bağlı olan bir durum söz konusudur. Bu tarz uygulamalarda daha ölçeklenebilir bir yapı elde edebilmek için, load balancing tarzı işlemler ile yük maliyetini farklı server’lara dağıtabilirsiniz.

  5. Tuncay GÜVEN Tuncay GÜVEN

    Merhaba,

    Uzun zamandır böyle bir proje arıyordum. Çok teşekkürler
    Şimdi 224 bilgisayar için uzaktan yönetilebilir bir program yazabilirim.

    Paylaşımlarını takip ediyor olucam Sağolasın

  6. Tuncay Güven Tuncay Güven

    Gökhan kardeşim selam,

    Anlattığın konu o kadar güzel olmuş ki inan uzun zamandır böyle bir örnek arıyordum.
    Senden bir ricam olacak server kısmını windows form olarak tasarlar sak nasıl yapmamız gerekiyor.
    Amaç 224 bilgisayarda ayrı ayrı server çalıştıracağım client makineden gelen komuta göre windows form içinde yapması gerekenleri yazacağım fakat form tarafını çözemedim. Örnek mail atabilir sen sevinirim teşekkürer
    Tuncay G.

  7. Ahmet Öztürk Ahmet Öztürk

    Merhaba Gökhan Abi,

    Anlatım çok güzel olmuş. 1 yıldır c# ile uğraşıyorum. bu projeyi windows olarak nasıl yapabilirim.
    Hocamız bir proje yapmamızı istedi bende havalı proje yapmak istiyorum Arduino ve c# ile uzaktan led kontrol uygulaması düşünüyorum. Labaratuvardaki iki bilgisayar arası soket ile bağlanıp bir bilgisayara bağlı olan arduino com üzerinden aldığı veriye göre led yakacak yada kapatacak. Arduino için bir abim yardımcı olacak.

    size simdiden teşekkürlerimi iletiyorum iyi çalışmalar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*