Netty:如果它是“keep-alive”连接,我应该关闭通道吗?

7
我正在使用Netty编写HTTP服务器。创建服务器引导时,我设置了keep-alive选项。 bootstrap.setOption("child.keepAlive", true); 每次写入HTTP响应时,我都会设置keep-alive头,并在写入响应后关闭通道。
rep.setHeader("Connection", "keep-alive");
channel.write(rep).addListener(ChannelFutureListener.CLOSE);

我不确定是否应该关闭Channel。

很难看出这里的神秘之处。你不可能认真地认为关闭一个通道就等同于保持它的活跃。 - user207421
2个回答

8

假设你正在编写一个HTTP 1.1服务器,你应该默认情况下在发送响应后保持连接处于打开状态。如果出于某种原因,你决定关闭它,你应该包括

Connection: close

在响应中。
请注意。
bootstrap.setOption("child.keepAlive", true);

打开套接字上的keepalive选项与HTTP无关,而是一种看门狗机制,用于在缺少“真正”的流量时检测断开的连接。


1
谢谢@forty-two!我的意图是保持连接活跃。只是为了确认一下:在我完成响应后,我需要这部分.addListener(ChannelFutureListener.CLOSE);吗? - woodings
对于大多数操作系统来说,默认的 SO_KEEPALIVE 超时时间非常长(例如在 Linux 中为 7200 秒),因此我不会对它抱有太多期望。如果客户端在一定时间内没有发送请求,您应该只需关闭连接即可。 - trustin

3
请注意,您还需要指定内容的长度:
  response.headers().set(CONTENT_LENGTH, response.content().readableBytes());

这样接收方才能确定消息的结束位置。否则,接收方将一直等待消息。

并且,需要明确的是,如果您希望保持连接处于打开状态,就不应该编写“.addListener(ChannelFutureListener.CLOSE);”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接