Tarayıcıdan websocket ping / pong çerçevesi gönderme


130

Bağlantıyı canlı tutmak için web soketlerindeki ping / pong mesajlarını okumaya devam ediyorum, ancak ne olduklarından emin değilim. Farklı bir çerçeve türü mü? (Chrome'da ping-pong ile ilgili bir javascript WebSocket nesnesinde herhangi bir yöntem görmüyorum). Ya da sadece bir tasarım kalıbı mı (örneğin, sunucuya tam anlamıyla "ping" veya başka bir dizge gönderiyorum ve yanıt vermesini sağlıyorum). Ping-pong hiç devam çerçeveleriyle ilgili mi?

Sormamın nedeni, Mongrel2'nin arkasında çalışan bir python çerçevesi kullanıyorum, bu yüzden Mongrel2'ye, python uygulamamın bunu yapması gerekmeden bağlantıyı canlı tutmasını söyleyecek belirli bir ping / pong mesajı göndermenin bir yolu olup olmadığını merak ediyorum. bunun için endişelen. Bunun için ayrı bir HTTP yöntemine sahip olmaya benzer sanırım. Ve adanmış bir ping / pong mesaj çerçevesinin "ping" dizesinden daha basit (sunucu ve ağ üzerinde daha az yük) olabileceğini hayal ediyorum, ancak bu muhtemelen çok fazla önemli olmayacaktır.

DÜZENLEME: RFC 6455'e baktım ve Ping ve Pong kesinlikle kendi işlem kodlarına sahip kontrol çerçeve türleri gibi görünüyor. Peki, Chrome'da javascript'ten nasıl Ping çerçevesi gönderebilirim?


Sadece sunucudan ping atın. Herkes standart olmayan bağlantı noktalarındaki ağ sorununu bilir, bu nedenle düzenli kısa aralıklarla ping yapmaya başlarlar. Sanırım kötü yazılmış bir sunucuya ping atabilirsiniz, ancak onlarla hassas bir şey yapmak çok akıllıca olmayabilir.


@ user1382306 sunucudan ping ilk olarak mobil cihaz pil kullanımını çok hızlı kullanacaktır. İstemciden gelen ping, cihaz pilinden tasarruf sağlayabilir.
bronz adam

@ user1382306 Herkes değil! Standart olmayan bağlantı noktalarında ağ oluşturma sorunu nedir?
HappyDog

Yanıtlar:


121

Ping çerçeveleri göndermek veya pong çerçeveleri almak için bir Javascript API'si yoktur. Bu, tarayıcınız tarafından destekleniyor veya desteklenmiyor. Ayrıca, tarayıcının ping / pong çerçevelerini destekleyip desteklemediğini ve kullanıp kullanmadığını etkinleştirmek, yapılandırmak veya tespit etmek için API yoktur. Bunun için bir Javascript ping / pong API oluşturmayla ilgili tartışma yapıldı . Pinglerin gelecekte yapılandırılabilir / tespit edilebilir olma olasılığı vardır, ancak Javascript’in doğrudan ping / pong çerçeveleri gönderip alması olası değildir.

Bununla birlikte, hem istemci hem de sunucu kodunu kontrol ediyorsanız, daha yüksek bir seviyede kolayca ping / pong desteği ekleyebilirsiniz. Zaten yoksa, mesajınızda bir tür mesaj türü başlığına / meta verisine ihtiyacınız olacak, ancak bu oldukça basit. Saniyede yüzlerce kez ping göndermeyi planlamıyorsanız veya binlerce eşzamanlı müşteriniz yoksa, bunu kendiniz yapmak için ek yük oldukça az olacaktır.


1
@bigmugcup Bağlantı kesildi
Bay Jo

19

Ping yalnızca sunucudan istemciye gönderilmek üzere tasarlanmıştır ve tarayıcı otomatik olarak Pong OpCode ile mümkün olan en kısa sürede yanıt vermelidir. Yani daha yüksek düzeyde bunun için endişelenmenize gerek yok.

Tüm tarayıcılar, bekledikleri gibi standardı desteklemese de, bu tür mekanizmayı uygulamada bazı farklılıklar olabilir ve hatta Pong yanıt işlevselliği olmadığı anlamına gelebilir. Ancak şahsen Ping / Pong kullanıyorum ve bu tür OpCode ve düşük seviyeli istemci tarafı uygulamasında otomatik yanıt uygulamayan bir istemciyi hiç görmedim.


73
Ping'in sadece sunucudan istemciye olduğunu nerede okudunuz? RFC, "Bir uç nokta bağlantı kurulduktan sonra ve bağlantı kapatılmadan önce herhangi bir zamanda Ping çerçevesi gönderebilir" diyor.
xryl669

7
İstemcinin bağlantısız bir durumu otomatik olarak algılamasını istiyorsanız (hiçbir RST / FIN paketi alınmadığında, ancak ağ bağlantısı kesildiğinde), istemcinin de ping paketleri başlatmasını sağlamanız gerekir.
pschwamb

13
TCP, RST / FIN paketleri alınmadığında bağlantı kesildiğini bildirmez. TCP, yalnızca bir gönderen bağlantısı kesilmiş bir bağlantı üzerinden gönderme girişiminde bulunduğunda kesilen bağlantıları algılar. Ping birçok uygulamada kalp atışı olarak kullanılır ve geçerli bir kullanımdır. Müşteri göndermeye çalışana kadar kesik bir bağlantı sonsuza kadar ölü kalacaktır. Bu nedenle, tarayıcıdaki WebSockets ile, istemci tarafında istemci bağlantısının kesilmesini algılamak için özel bir ping (veya kalp atışı) mesajı kullanılmalıdır. Sunucu ping atmaya çalışıyor olabilir ve istemcinin bağlantısının kesildiğini algılayabilir, ancak istemciye bilgi verilmemiştir. İstemci pingleri de iyidir.
DDS

15
RFC 6455'te, WebSocket Protokolü, açıkça belirtir: "NOT: Ping çerçevesi, canlı tutma olarak veya uzak uç noktanın hala yanıt verdiğini doğrulamak için bir araç olarak hizmet edebilir."
DDS

4
Kullanıcı aracıları sık sık yenilendiğinde, yalnızca sunucu pinginin önerilen bir uygulama olması mümkündür. Ancak artık birçok web sitesi SPA'lar olarak tasarlanıyor. Bu ortamda, istemci uygulamasının, bağlantının kopmamasını sağlamak için sunucuya düzenli olarak ping yapması oldukça önemli olabilir.
Noel Abrahams
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.