Come faccio a sapere QUANDO chiudere una connessione Keep-Alive HTTP 1.1?
-
02-07-2019 - |
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
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.