2012-11-28 41 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);”如果你想让你的连接保持开放。

相关问题