这可能很简单,但我无法理解。基于My 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)
}
})
我错过了什么?
答案 0 :(得分:2)
您需要Content-Length标头,否则客户端将不知道何时停止阅读,并将不断轮询更多数据。