Asp.Net Core’da WebSocket Kullanımı

Merhaba, bugün ki yazımızda WebSocket’ten bahsedeceğiz. Ama öncelikle sunucu-istemci mimarisinde haberleşmeye bakmamız gerekir. Web uygulamarı(istemci) sunucuyla HTTP protokolü üzerinden istek/cevap mantığıyla haberleşir. İstemci sunucudan bir şey talep ettiğinde bir bağlantı açar ve bir istek gönderir. Sunucu isteği alır ve gerekli işlemleri yapar. Sunucu, istemciye cevabı döner. Bu trafik sürekli bu şekilde devam eder. İstemci her istek için bir bağlantı açmak zorundadır. Ve eğer sunucuda istemciye verebileceği yeni bir bilgi varsa, bunu istemciye doğrudan gönderemez, yerine istemciden talep gelmesini beklemelidir.

Bu fazlalık tüm bir bant genişliğini doldurabilmektedir. Daha kötüsü bu durum istemcinin 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 ile istemci 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 WebSocket’di. WebSocket, internetin karmaşık haberleşme işlemlerini gerçek-zamanlı olarak gerçekleştirebilmesini sağlayan bir sistemdir. WebSocket, 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.

İşe öncelikle WebsocketKullanimi adında bir tane core web application projesi açıyoruz. 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 WebSocket kullanacağızı bildiriyoruz. İstemci 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 Socket kullanacağımızı UseWebSockets() fonksiyonu ile ortama bildiriyoruz. Uygulama ayağa kalktığında gelen istekleri dinlemeye başlıyoruz. Gelen bu talep bir Web Socket 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 tabi) 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 metodtan 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 WebSocket 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:

https://buraksenyurt.com/post/asp-net-core-da-bir-websocket-macerasi