2012-11-28 13 views
6

Sto scrivendo un server HTTP con Netty. Ho impostato l'opzione keep-alive quando creo il bootstrap del server. bootstrap.setOption("child.keepAlive", true); Ogni volta che scrivo una risposta HTTP, imposto l'intestazione keep-alive e chiudo il canale dopo aver scritto la risposta.Netty: devo chiudere il canale se si tratta di una connessione "keep-alive"?

rep.setHeader("Connection", "keep-alive"); 
channel.write(rep).addListener(ChannelFutureListener.CLOSE); 

Non sono sicuro di dover chiudere il canale.

+0

Difficile vedere quale sia il mistero qui. Non si può seriamente pensare che la chiusura di un canale costituisca il mantenerlo in vita. – EJP

risposta

7

Supponendo che si stia scrivendo un server HTTP 1.1, è necessario mantenere la connessione aperta per impostazione predefinita dopo l'invio della risposta. Se, per qualche motivo, decidete di chiuderlo comunque, dovreste includere

Connection: close 

nella risposta.

Nota che

bootstrap.setOption("child.keepAlive", true); 

attiva l'opzione keepalive sul socket e non ha nulla a che fare con HTTP; piuttosto, è una sorta di meccanismo di sorveglianza per rilevare collegamenti interrotti in assenza di traffico "reale".

+1

Grazie @ quarantadue! Il mio intento era di mantenere viva la connessione. Solo per confermare questo: ho bisogno di questa parte '.addListener (ChannelFutureListener.CLOSE);' dopo aver finito di scrivere la risposta? – woodings

+0

Per la maggior parte dei sistemi operativi, il timeout predefinito 'SO_KEEPALIVE' è molto lungo (ad esempio 7200 secondi in Linux.), Quindi non mi aspetto molto da esso. Dovresti semplicemente chiudere la connessione se nessuna richiesta è stata inviata da un cliente per un certo periodo di tempo. – trustin

3

Si noti che è necessario anche specificare la lunghezza del contenuto:

response.headers().set(CONTENT_LENGTH, response.content().readableBytes()); 

modo che il ricevitore può capire dove il messaggio è terminato. Altrimenti, la ricezione continuerà ad aspettare il messaggio.

E, per essere chiari, non si dovrebbe scrivere ".addListener (ChannelFutureListener.CLOSE);" se vuoi che la tua connessione rimanga aperta.

Problemi correlati