Merhaba,Bugün ki yazımızda WebSocket’ten bahsedeceğiz. Ama öncelikle Sunucu-İstemci mimarisinde haberleşmeye bakmamız gerekir. Web uygulamarı(Client) Sunucuyla HTTP protekolü üzerinden Request/Response mantığıyla haberleşir. Client sunucudan bir şey talep ettiğinde bir bağlantı açar ve bir Request gönderir.Sunucu Request’i alır ve gerekli işlemleri yapar.Sunucu,Cliente’a cevabı Response eder.Bu trafik sürekli bu şekilde devam eder.Client her Request için bir Connection açmak zorunda.Ve eğer Sunucuda Client’ta verebileceği yeni bir bilgi varsa, bunu Client’a doğrudan gönderemez, yerine Client’in talep gelmesini beklemelidir.

Bu fazlalık tüm bir bant genişliğini doldurabilmektedir. Daha kötüsü bu durum Client’in ikinci bir bilgi ile dolmasını neredeyse engelleyebilir. Bu da anlık hıza ihtiyaç duyulan online finansal işlemlerde büyük kayıplara neden olabilmektedir.

Web geliştiricileri uzun yıllardır HTTP’nin bu kısıtlamasını aşmak ve herhangi bir bağlantı esnasında daha çok veri transferini sağlayabilmek için sistemler geliştiriyorlardı. Fakat asıl yapmak istedikleri sunucu (Server) ile istemci (Client) arasındaki bağlantıyı hiç koparmadan her iki tarafında birbirlerine karşılıklı veri alıp-göndermesine olanak sağlamaktı.

İşte tam bu ihtiyaca şifa gibi gelecek olan çözüm standartları neredeyse oturmak üzere olan HTML5’ten geldi. HTML5 ile gelen bu yeni protokol WebSockets’di.WebSockets, internetin karmaşık haberleşme işlemlerini gerçek-zamanlı olarak gerçekleştirebilmesini sağlayan bir sistemdir. WebSockets, istemciye bir bağlantı kurup bu bağlantıyı istediği kadar sürdürebilmesini ve veriyi iki taraflı olarak hem almasını hem de göndermesini sağlıyor.

Asp .Net Core’da WebSocket Örneği

Web Socketi kullanmak için basit bir script bilgisi ve .net core da orta düzey bir bilgi yeterlidir.Mantığı basit zaten.Hadi başlayalım.

İşe öncelikle WebsocketKullanimi adında bir tane core web application projesi açarak başlıyorum.Daha sonra projeye Nuget üzerinden AspNetCore.WebSockets paketini ekliyoruz.

Install-Package Microsoft.AspNetCore.WebSockets -Version 2.2.1

İlk olarak uygulamamızın Startup.cs sınıfında Configure methodunda gerekli ayarları yapacağız.Çalışma zamanında WebSockets kullanacağızı bildiriyoruz.Client ile Sunucu arasındaki iletişimi açıp gelen isteklerin mesajları kontrol edeceğiz. Amacımız gelen mesajı yakalayıp ve ona bir şeyler söylemek.

Kodların içinde ilk önce Configure methoduna bakıyoruz. Web Sockets kullanacağımızı UseWebSockets fonksiyonu ile ortama bildiriyoruz.  Uygulama ayağa kalktığında gelen istekleri dinlemeye başlıyoruz. Gelen bu talep bir Web Sockets isteğiyse(ki bunun ws:// protokolü ile başlayan bir talep olması gerekiyor) bir socket nesnesi yakalıyor ve Talk isimli fonksiyonu çağırıyoruz(Yine asenkron olarak tabii) Eğer gelen istek /nokya adresine yapılmamışsa bir sonraki mesajı bekleyecek şekilde dinleme işlemine devam ediliyor.

Talk operasyonu içerisinde istemciden gelen mesajın terminale basılması ve rastgele üretilen bir sayı değerinin geri gönderilmesi için gerekli kodlar yer alıyor. İstemcinin gönderdiği mesajın yakalanması için ReceiveAsync isimli metoddan yararlanılmakta. Metodun ilk parametresi gelen içeriği bir Byte dizisine alıyor. Eğer aradaki iletişim açıksa(CloseStatus.HasValue ile bu kontrol edilmekte) bu byte içeriğini string’e dönüştürmek yeterli. Bağlı olan istemciye soket üzerinden mesaj göndermek içinse SendAsync metodundan yararlanılmakta. Trafik byte array’ler ile çalışıyor bu nedenle string operasyonları için UTF8 tabanlı Encoding mekanizmalarından yararlanılmakta.

Program.cs’de kullanacağımız portu ayarlıyoruz. http://localhost:5556 adresinden yayın yapacağız ve istemcilerimiz ws://localhost:5556/nokya adresini kullanarak websocket temelli iletişimi kurabileceklerdir.

Örnek projede istemci olarak index.html sayfasında javascript kullanılarak socketle haberleşeceğiz.wwwroot klasöründe koyduğumuz sayfanın içeriği aşağıdaki gibidir.

Kodlarımızda btnConnect butonuna basıldığında çalışıyor. Dikkat edileceği üzere bir WebSocket nesnesi üretilmekte. Adres olarak da ws://localhost:5556/nokya adresi kullanılıyor. Adresin ws ile başladığına dikkat edelim. Oluşturulan WebSockets nesnesi için bazı olaylar tanımlanıyor. Bağlantı açıldığında, kapatıldığında, sunucudan mesaj alındığında veya bir hata oluştuğunda. Sunucuya mesaj göndermek için WebSocket nesnesinin send fonksiyonundan yararlanılmakta.

Projeyi debug edip sonuçları kendiniz görebilirsiniz.Umarım faydalı olmuştur.

Kaynak Kodu

Yararlanılan kaynaklar