Domanda

Nella mia applicazione mochiweb, sto usando una lunga richiesta HTTP in attesa. Ho voluto rilevare quando il collegamento con l'utente è morto, e ho capito come fare che facendo:

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

Questo funziona quando: utente chiude la sua scheda / browser o aggiorna la pagina. Tuttavia, quando la connessione Internet muore improvvisamente (dire segnale wifi perso tutto ad un tratto), o quando il browser si blocca in modo anomalo, non sono in grado di rilevare un tcp vicino.

Mi manca qualcosa, o c'è qualche altro modo per raggiungere questo?

È stato utile?

Soluzione

C'è un protocollo keepalive e può essere abilitata con inet:setopts/2 sotto il opzione {keepalive, Boolean}.

Vorrei suggerire che non ne fanno uso. Il timeout keep-alive e max-tentativi tende ad essere a livello di sistema, ed è facoltativa, dopo tutto. Utilizzando i timeout a livello di protocollo è migliore.

Il protocollo HTTP ha il codice di stato Request Timeout , che è possibile inviare al cliente se sembra morta.

Controlla la clausola di after a ricevere blocchi che è possibile utilizzare per timeout in attesa dei dati, o utilizzare il modulo timer, o utilizzare erlang:start_timer/3. Tutti hanno differenti caratteristiche di prestazioni e costi delle risorse.

Altri suggerimenti

non è un default "mantenere in vita" (ma può essere abilitato se supportato ) protocollo su TCP: nel caso ci sia un errore di connessione quando i dati non vengono scambiati, questo si traduce in un "fallimento silenzioso". Si avrebbe bisogno di tenere conto di questo tipo di errore da soli per esempio implementare una qualche forma di collegamento sondare.

che modo questo influisce HTTP? HTTP è un protocollo senza stato - questo significa che ogni richiesta è indipendente da ogni altro. Il "tenere in vita" la funzionalità di HTTP non cambia che vale a dire "fallimento silenzioso" può ancora verificarsi.

Solo quando vengono scambiati dati può essere rilevato questa condizione (o quando il protocollo TCP Keep Alive è abilitato).

Vorrei suggerire l'invio del livello di applicazione mantenere messaggi alive su HTTP-codifica Chunked. Avere il vostro client / server abbastanza intelligente per capire il mantenere messaggi alive e ignorare loro se arrivare in tempo o chiudere e ristabilire di nuovo la connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top