2012-11-28 8 views
6

Ich schreibe einen HTTP-Server mit Netty. Ich setze die Keep-Alive-Option, wenn ich Server-Bootstrap erstellen. bootstrap.setOption("child.keepAlive", true); Jedes Mal, wenn ich eine HTTP-Antwort schreibe, setze ich den keep-alive-Header und schließe den Kanal nach dem Schreiben der Antwort.Netty: Sollte ich den Kanal schließen, wenn es eine "keep-alive" Verbindung ist?

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

Ich bin mir nicht sicher, ob ich den Kanal schließen soll.

+0

Schwer zu sehen, was das Geheimnis hier ist. Sie können nicht ernsthaft denken, dass das Schließen eines Kanals es am Leben hält. – EJP

Antwort

7

Angenommen, Sie schreiben einen HTTP 1.1-Server, sollten Sie die Verbindung nach dem Senden der Antwort standardmäßig beibehalten. Wenn Sie sich aus irgendeinem Grund dafür entscheiden, es dennoch zu schließen, sollten Sie in die Antwort

einfügen.

Beachten Sie, dass

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

schaltet die Keep-Alive-Option auf dem Sockel und hat nichts mit HTTP zu tun; es ist vielmehr eine Art Watchdog-Mechanismus, um in Abwesenheit von "echtem" Verkehr kaputte Verbindungen zu erkennen.

+1

Danke @ zweiundvierzig! Meine Absicht war es, die Verbindung am Leben zu erhalten. Nur um dies zu bestätigen: brauche ich diesen Part '.addListener (ChannelFutureListener.CLOSE);' nachdem ich die Antwort geschrieben habe? – woodings

+0

Für die meisten Betriebssysteme ist das Standard-Zeitlimit "SO_KEEPALIVE" sehr lang (z. B. 7200 Sekunden in Linux.), Daher würde ich nicht viel davon erwarten. Sie sollten die Verbindung nur schließen, wenn für einen bestimmten Zeitraum keine Anforderungen von einem Client gesendet wurden. – trustin

3

Beachten Sie, dass Sie auch die Länge des Inhalts angeben müssen:

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

so dass der Empfänger kann herausfinden, wo die Nachricht beendet ist. Sonst wartet der Empfänger weiter auf die Nachricht.

Und um klar zu sein, sollten Sie nicht schreiben ".addListener (ChannelFutureListener.CLOSE);" wenn Sie möchten, dass Ihre Verbindung offen bleibt.