Domanda

Sto scrivendo un server Web in Java e voglio che supporti connessioni HTTP 1.1 Keep-Alive. Ma come posso sapere quando il client ha finito di inviare richieste per una determinata connessione? (come una doppia fine riga o qualcosa del genere).

Vediamo come StackOverflow gestisce questa domanda molto oscura - le risposte per le quali, su Google, sono impantanate in specifiche tecniche e linguaggio oscuro. Voglio una risposta in inglese per un programmatore non C :)


Capisco. ciò conferma il mio sospetto di dover fare affidamento su SocketTimeoutException. Ma non ero sicuro che ci fosse qualcosa su cui potevo fare affidamento dal client che indica che è stato fatto con la connessione - il che mi consentirebbe di chiudere le connessioni prima nella maggior parte dei casi - invece di aspettare il timeout. Grazie

È stato utile?

Soluzione

Se stai costruendo il tuo server per soddisfare lo standard, allora hai già molte informazioni per guidarti qui.

Semplicemente parlato, dovrebbe essere basato su un tempo trascorso dall'utilizzo di una connessione e non tanto a livello di dati di richiesta.

In modo più lungo, la sezione considerazioni pratiche del documento HTTP / 1.1 contiene alcune indicazioni per te:

  

" I server normalmente ne avranno alcuni   valore di timeout oltre il quale lo faranno   non mantenere più un inattivo   connessione. I server proxy potrebbero creare   questo è un valore più elevato poiché è probabile   che il cliente farà di più   connessioni attraverso lo stesso server.   L'uso di connessioni persistenti   non richiede requisiti sulla lunghezza   (o esistenza) di questo timeout per   sia il client che il server. "

o

  

" Quando un client o un server lo desidera   timeout DOVREBBE emettere un grazioso   chiudere il collegamento di trasporto.   Clienti e server DOVREBBERO entrambi   costantemente guardare dall'altra parte di   il trasporto si chiude e risponde ad esso   come appropriato. Se un client o un server   non rileva la chiusura dell'altra parte   prontamente potrebbe causare inutili   drenaggio delle risorse sulla rete. "

Altri suggerimenti

  

Vediamo come StackOverflow gestisce questa domanda molto oscura - le risposte per le quali, su Google, sono impantanate in specifiche tecniche e linguaggio oscuro.

Ho appena messo Quando dovrei chiudere una connessione HTTP 1.1? in Google e il terzo successo è stato HTTP reso davvero facile. Nel sommario è presente un collegamento a una sezione intitolata Persistent Connections e il " ; Connessione: chiudi " Intestazione . Questa sezione è lunga tre paragrafi, usa un linguaggio molto semplice e ti dice esattamente quello che vuoi sapere.

  

Voglio una risposta in inglese per un programmatore non C :)

Con tutto il rispetto, la programmazione è uno sforzo tecnico in cui i dettagli contano molto. Leggere la documentazione tecnica è un'abilità assolutamente essenziale. Basandosi su "inglese semplice" interpretazioni da parte di terzi delle specifiche comporteranno solo un cattivo lavoro.

Lo chiudi quando vuoi. L'intestazione indica che il client preferirebbe lasciare aperta la connessione, ma ciò non richiede che il server sia conforme. La maggior parte dei server lo lascia aperto per circa 5-10 secondi, alcuni non lo prestano affatto.

Dovresti leggere gli RFC relativi alla funzione Keep-Alive. Altrimenti potresti finire con un server che non funziona come previsto.

Come ha già sottolineato @ [Stephen], il server è libero di chiudere la connessione ogni volta che lo desidera (ok, non nel mezzo di una coppia richiesta / risposta). Idem per il cliente. Qualsiasi altra soluzione consentirebbe al server o al client di eseguire un DoS sull'altra parte.

EDIT: dai un'occhiata all'intestazione Connection. Il client (e il server) può richiedere una chiusura aggraziata della connessione usando l'intestazione. Ad esempio, Connessione: chiudi all'interno della richiesta è una richiesta al server di chiudere la connessione dopo aver inviato la risposta.

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