Netty http服务器响应
这可能很简单,但我想不出来。我的基于Netty 4的http服务器导致http客户端挂起其响应。它设法通过其响应负载发送(使用curl作为客户机观察到),但客户机似乎没有意识到响应已经完成,他们无限期地等待它完成。使用curl、firefox和chrome进行观察 只有修改代码以关闭通道(channel.close,如下面内联所示),客户端才会确认响应已完成。否则,他们只是继续等待它完成。我希望通道保持打开状态,以便下一个客户端请求不需要打开新连接(我希望保持活动状态),因此关闭通道似乎不太可能。因此,我不确定服务器应该如何在不关闭连接的情况下将响应标记为结束 服务器代码:Netty http服务器响应,http,netty,Http,Netty,这可能很简单,但我想不出来。我的基于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)
}
})
val response=newdefaultfullhttpresponse(HttpVersion.HTTP_1_1,HttpResponseStatus.OK)
val buf=新的StringBuilder
buf.append(“你好”)
response.data.writeBytes(unmooled.copiedBuffer(buf,CharsetUtil.UTF_8))
write(response).addListener(新的ChannelFutureListener(){
def操作完成(信道未来:信道未来){
如果(channelFuture.isSuccess){
println(“服务器写入成功完成”)
//channelFuture.channel.close您需要一个内容长度标题,否则客户端将不知道何时停止读取,并将持续轮询更多数据。您是否发送内容长度标题?不是真的,我没有主动添加任何标题。是吗?是的。如果没有内容长度标题,客户端将不知道何时停止读取。我f你的内容只是“你好”,然后添加:Content Length:5.谢谢。有点天真,writeBytes会处理这个问题……难道没有其他方法可以使用Netty API来编写响应数据,同时处理内容和长度吗?响应的数据长度不是在API中的某个地方透明管理的吗?我对NettyNo不熟悉,没有。我有e帮助器类来完成它,但这是您需要自己处理的事情。