2012-11-28 46 views
6

我正在用Netty編寫HTTP服務器。當我創建服務器引導時,我設置了保持活動選項。 bootstrap.setOption("child.keepAlive", true); 每次我寫入HTTP響應時,我都會在寫入響應之後設置keep-alive標頭並關閉通道。Netty:如果它是'保持活動'連接,我應該關閉頻道嗎?

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

我不確定我是否應該關閉該頻道。

+0

很難看到這裏有什麼神祕之處。你不能認真地認爲關閉一個頻道是爲了保持它的活力。 – EJP

回答

7

假設您正在編寫HTTP 1.1服務器,您應該默認在發送響應後保持連接打開。如果由於某種原因無論如何決定關閉它,您應該包括

Connection: close 

在響應中。

注意

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

打開插座上的keepalive選項和無關與HTTP;相反,它是一種監視機制,以便在沒有「真實」流量的情況下檢測斷開的連接。

+1

謝謝@四十二!我的意圖是保持連接活着。只是爲了證實這一點:我需要這部分'.addListener(ChannelFutureListener.CLOSE);'我寫完迴應後? – woodings

+0

對於大多數操作系統,默認的'SO_KEEPALIVE'超時時間非常長(例如在Linux中爲7200秒),所以我不會期望太多。如果客戶端沒有發送請求一段時間,您應該關閉連接。 – trustin

3

請注意,您還需要指定內容的長度:

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

,以便接收器可以計算出該消息已經結束的位置。否則,接收者將繼續等待消息。要清楚的是,你不應該寫「.addListener(ChannelFutureListener.CLOSE);」如果你想讓你的連接保持開放。

相關問題