3

这可能很简单,但我无法弄清楚。我的基于 Netty 4 的 http 服务器导致 http 客户端挂起它的响应。它设法通过其响应有效负载发送(如使用 curl 作为客户端所观察到的那样),但客户端似乎没有意识到响应已经完成并且他们无限期地等待它完成。使用 curl 以及 firefox 和 chrome 进行观察。

仅当我修改代码以关闭通道(channel.close,如下面的内联所示)时,客户端才会确认响应已完成。否则,他们只是继续等待它完成。我希望通道保持打开状态,以便下一个客户端请求不需要打开新连接(我希望保持活动行为),因此关闭通道似乎不合理。所以我不确定服务器应该如何将响应标记为结束——而不关闭连接。

服务器代码:

val response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)
val buf = new StringBuilder
buf.append("hello")
response.data.writeBytes(Unpooled.copiedBuffer(buf, CharsetUtil.UTF_8))
ctx.write(response).addListener(new ChannelFutureListener(){
  def operationComplete(channelFuture: ChannelFuture){
    if (channelFuture.isSuccess){
        println("server write finished successfully")
        //channelFuture.channel.close <===== if uncommented, clients receive the response, otherwise they just keep waiting forever
    }
    else 
        println ("server write failed: " + channelFuture.cause + "\n" + channelFuture.cause.getStackTraceString)
  }
})  

我错过了什么??

4

1 回答 1

2

您需要一个 Content-Length 标头,否则客户端将不知道何时停止读取,并会不断轮询更多数据。

于 2013-02-20T17:29:15.653 回答