【问题标题】:Netty: Should I close the Channel if it's a 'keep-alive' connection?Netty:如果 Channel 是“keep-alive”连接,我应该关闭它吗?
【发布时间】:2013-06-21 17:48:23
【问题描述】:

我正在用 Netty 编写一个 HTTP 服务器。我在创建服务器引导程序时设置了 keep-alive 选项。 bootstrap.setOption("child.keepAlive", true); 每次写 HTTP 响应时,我都会设置 keep-alive 头,并在写完响应后关闭通道。

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

我不确定我是否应该关闭频道。

【问题讨论】:

  • 很难看出这里有什么奥秘。你不能认真地认为关闭一个频道就等于让它保持活力。

标签: java netty keep-alive


【解决方案1】:

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

Connection: close

在响应中。

注意

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

开启socket上的keepalive选项,与HTTP无关;相反,它是一种看门狗机制,用于在没有“真实”流量的情况下检测断开的连接。

【讨论】:

  • 谢谢@四十二!我的意图是保持连接活跃。只是为了确认这一点:写完回复后我需要这部分.addListener(ChannelFutureListener.CLOSE);吗?
  • 对于大多数操作系统,默认的SO_KEEPALIVE 超时时间很长(例如在 Linux 中为 7200 秒。),所以我对它的期望不高。如果客户端在一定时间内没有发送请求,您应该关闭连接。
【解决方案2】:

注意,你还需要指定内容的长度:

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

以便接收者可以确定消息在哪里结束。否则,接收将继续等待消息。

而且,要清楚,你不应该写“.addListener(ChannelFutureListener.CLOSE);”如果您希望您的连接保持打开状态。

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多