2009-12-30 17 views
6

Mochiweb uygulamasında, uzun tutulan bir HTTP isteği kullanıyorum. kullanıcı ile bağlantı öldüğünde algılamak istiyordum ve yaparak bunu nasıl anladım: kullanıcının kendi sekmesi/tarayıcısını kapattığında veya sayfayı yeniler: Bu işlerHTTP algılaması inet kullanılarak HTTP kapatılıyor

Socket = Req:get(socket), 
inet:setopts(Socket, [{active, once}]), 
receive 
    {tcp_closed, Socket} -> 
      % handle clean up 
    Data -> 
      % do something 
end. 

. Ancak, internet bağlantısı aniden öldüğünde (wifi sinyali aniden kaybolduysa) veya tarayıcı anormal bir şekilde çökerse, bir tcp kapanışı algılayamıyorum.

bir şey eksik veya bunu başarmak için başka bir yolu var mı?

cevap

2

TCP keepalive protocol vardır ve {keepalive, Boolean} seçeneği altında inet:setopts/2 ile etkinleştirilebilir.

Bunu kullanmamanızı öneririm. Canlı tutma zaman aşımı ve maksimum yeniden deneme, sistem genelinde olma eğilimindedir ve her şeyden önce isteğe bağlıdır. Protokol düzeyinde zaman aşımlarını kullanmak daha iyidir.

HTTP protokolü cansız gibi eğer müşteriye gönderebilir status code Request Timeout sahiptir.

Kontrol dışarı after maddesini size veri bekleniyor zaman aşımına uğramasına kullanmak veya zamanlayıcı modülü kullanmak veya erlang:start_timer/3 kullanabilirsiniz blokları alırlar. Hepsi farklı performans özelliklerine ve kaynak maliyetlerine sahiptir. Başvuru seviyesini gönderme öneririm

+0

Ben fıkra sonra kullanmayı düşündü, fakat bu durumda, benim süreci uyku modundaki süreç olabilir. Sonraki madde hala hazırda bekletme işlemi için çalışır mı? – jeffreyveon

+0

Hayır, olmazdı. Bir mesaj gönderildiğinde bir hazırda bekleme süreci uyanır. Hazırda bekleme zaman aşımı yok, bu yüzden uyandırmak için size iletilen bir gecikme mesajı var. – Christian

1

TCP üzerinde varsayılan bir "canlı tutmak" (ancak enabled if supported olabilir) protokolü yoktur: durumunda hiçbir veri alışverişi bir bağlantı hatası vardır, bu bir "sessiz başarısızlık" anlamına. Bu tür bir arızayı kendiniz hesaba katmanız gerekir. bir çeşit bağlantı probunu uygular.

Bu nasıl HTTP etkiler? HTTP vatansız bir protokoldür - bu her talebin birbirinden bağımsız olduğu anlamına gelir. HTTP'nin "canlı kalsın" işlevselliği değişmez, yani "sessiz hata" hala oluşabilir.

Yalnızca veriler değiştirildiği zaman bu koşul algılanabilir (veya TCP Keep Alive etkinleştirildiğinde).

0

yığını-kodlama üzerinden HTTP canlı mesajların tutulmasına. İstemcinizi/sunucunuzu canlı mesajları saklamak için yeterince akıllı hale getirin ve zamanında varırlarsa ya da kapatırlarsa ve tekrar bağlantıyı yeniden kurarlarsa bunları göz ardı edin.