这可能很简单,但我无法解决。我的基于Netty 4的http服务器导致http客户端在响应期间挂起。它成功发送其响应有效负载(使用curl作为客户端进行观察),但客户端似乎没有意识到响应已经完成,它们无限期地等待它完成。这是在curl、firefox和chrome中观察到的。
只有当我修改代码以关闭通道(channel.close,如下所示),然后客户端才确认响应已完成。否则,他们将继续等待它完成。我希望通道保持打开状态,以便下一个客户端请求不需要打开新连接(我希望具有持续连接的行为),因此关闭通道似乎不可行。因此,我不确定服务器应该如何标记响应已结束 - 而不关闭连接。
服务器代码:
我错过了什么?
只有当我修改代码以关闭通道(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)
}
})
我错过了什么?