Başkalarından çok şey kapsayan bazı harika cevaplar. İşte biraz fazladan.
WebSocket'lerin Java Applet'leri, Flash veya Silverlight gibi eklentilere göre tek avantajı, WebSocket'lerin tarayıcılarda yerleşik olması ve eklentilere dayanmamasıdır.
Bununla bir soket bağlantısı kurmak için Java Applet'leri, Flash veya Silverlight'ı kullanabileceğinizi kastediyorsanız, evet, bu mümkündür. Ancak bunun gerçek dünyada kısıtlamalar nedeniyle çok sık kullanıldığını görmüyorsunuz.
Örneğin, aracılar bu trafiği kapatabilir ve kapatabilir. WebSocket standardı, mevcut HTTP altyapısıyla uyumlu olacak şekilde tasarlanmıştır ve bu nedenle, güvenlik duvarları ve proxy'ler gibi aracıların müdahalesine çok daha az eğilimlidir.
Dahası, WebSocket, mevcut HTTP altyapısıyla mümkün olduğunca uyumlu olacak şekilde protokol tasarımı sayesinde, özel portlar gerektirmeden port 80 ve 443'ü kullanabilir.
Bu soket alternatiflerinin (Java, Flash ve Silverlight) çapraz kaynaklı bir mimaride güvenli bir şekilde kullanılması zordur. Bu nedenle, onları çoğunlukla çapraz olarak kullanmaya çalışan insanlar, güvenli bir şekilde yapma çabasına gitmek yerine güvensizliklere tahammül edeceklerdir.
Ayrıca ek "standart olmayan" bağlantı noktalarının açılmasını (yöneticilerin yapmaktan nefret ettikleri bir şey) veya yönetilmesi gereken ilke dosyalarını gerektirebilirler.
Kısacası, soket bağlantısı için Java, Flash veya Silverlight kullanmak yeterince sorunludur, ciddi mimarilerde çok sık kullanıldığını görmezsiniz. Flash ve Java, muhtemelen en az 10 yıldır bu özelliğe sahipler ve henüz yaygın değil.
WebSocket standardı, bu kısıtlamaları akılda tutarak yeni bir yaklaşımla başlayabildi ve umarım onlardan bazı dersler çıkardı.
Bazı WebSocket uygulamaları, WebSocket bağlantısı kurulamadığında (örneğin eski bir tarayıcıda çalışırken veya bir aracı müdahale ettiğinde) yedek olarak Flash'ı (veya muhtemelen Silverlight ve / veya Java'yı) kullanır.
Bu durumlar için bir tür geri dönüş stratejisi akıllıca, hatta gerekli olsa da, Flash ve diğerlerini kullananların çoğu yukarıda açıklanan dezavantajlardan muzdarip olacaktır. Bu şekilde olmak zorunda değil - Flash, Silverlight, vb. Kullanarak güvenli çapraz kaynak özellikli bağlantılar elde etmek için geçici çözümler var - ancak çoğu uygulama bunu yapmayacak çünkü kolay değil.
Örneğin, çapraz kaynak bağlantısı için WebSocket'e güveniyorsanız, bu iyi çalışacaktır. Ancak daha sonra eski bir tarayıcıda veya bir güvenlik duvarında / proxy'de müdahale ederseniz ve mesela, yedek olarak Flash'a güvenirseniz, aynı çapraz kaynak bağlantısını yapmakta zorlanacaksınız. Tabii ki güvenliği önemsemediğiniz sürece.
Bu, yerel ve yerel olmayan bağlantılar için çalışan tek bir birleşik mimariye sahip olmanın zor olduğu anlamına gelir, oldukça fazla iş yapmaya veya bunu iyi yapan bir çerçeveye gitmeye hazır değilseniz. İdeal bir mimaride, bağlantıların yerel olup olmadığını fark etmezsiniz; güvenlik ayarlarınız her iki durumda da çalışır; kümeleme ayarlarınız yine de çalışır; kapasite planlamanız yine de geçerli olacaktır; ve bunun gibi.
WebSocket'lerin http akışına göre tek avantajı, alınan verileri "anlamak" ve ayrıştırmak için çaba sarf etmeniz gerekmemesidir.
Verileriniz dakikalar, saatler veya daha uzun süre akarken, bir HTTP akışını açmak ve arkanıza yaslanmak kadar basit değildir. Farklı müşteriler farklı davranır ve bunu yönetmeniz gerekir. Örneğin, bazı istemciler verileri arabelleğe alacak ve bazı eşikler karşılanana kadar uygulamaya bırakmayacaktır. Daha da kötüsü, bazıları bağlantı kapanana kadar verileri uygulamaya aktarmaz.
Dolayısıyla, istemciye birden fazla mesaj gönderiyorsanız, istemci uygulamasının, örneğin 50 mesaj değerinde veri alınana kadar verileri almaması mümkündür. Bu çok gerçek zamanlı değil.
HTTP akışı, WebSocket mevcut olmadığında uygulanabilir bir alternatif olabilir, ancak her derde deva değildir. Gerçek dünya koşullarında Web'in kötü bölgelerinde sağlam bir şekilde çalışmak için iyi bir anlayışa ihtiyacı vardır.
Kaçırdığım başka önemli farklılıklar var mı?
Henüz kimsenin bahsetmediği bir şey daha var, bu yüzden onu açacağım.
WebSocket protokolü, daha yüksek seviyeli protokoller için bir taşıma katmanı olacak şekilde tasarlanmıştır. JSON mesajlarını veya neyi doğrudan bir WebSocket bağlantısı üzerinden gönderebilirken, standart veya özel protokolleri de taşıyabilir.
Örneğin, insanların zaten yaptığı gibi WebSocket üzerinden AMQP veya XMPP yapabilirsiniz. Böylece bir istemci, AMQP aracısından doğrudan aracının kendisine (ve bazı durumlarda bağlı) bağlıymış gibi mesajlar alabilir.
Veya bazı özel protokollere sahip mevcut bir sunucunuz varsa, bunu WebSocket üzerinden taşıyabilir, böylece bu arka uç sunucusunu Web'e genişletebilirsiniz. Genellikle, kuruluşta kilitlenmiş olan mevcut bir uygulama, arka uç altyapısını değiştirmek zorunda kalmadan WebSocket kullanarak erişimini genişletebilir.
(Doğal olarak, tüm bunları güvenli bir şekilde yapmak istersiniz, bu nedenle satıcıya veya WebSocket sağlayıcısına danışın.)
Bazı kişiler WebSocket'e Web için TCP olarak başvurmuştur. Çünkü tıpkı TCP'nin üst düzey protokolleri taşıdığı gibi, WebSocket de öyle, ancak bir şekilde Web altyapısıyla uyumludur.
Bu nedenle, JSON (veya her neyse) mesajlarını doğrudan WebSocket üzerinden göndermek her zaman mümkün olsa da, mevcut protokoller de dikkate alınmalıdır. Çünkü yapmak istediğiniz birçok şey için, muhtemelen bunu yapmak için zaten düşünülmüş bir protokol vardır.
SO ile ilgili birçok soruyu tek bir soruda tekrar soruyorsam veya birleştiriyorsam özür dilerim, ancak SO'da ve bu kavramlarla ilgili web'de bulunan tüm bilgilerden mükemmel bir anlam çıkarmak istiyorum.
Bu harika bir soruydu ve cevapların hepsi çok bilgilendirici oldu!