Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Netty http服务器响应_Http_Netty - Fatal编程技术网

Netty http服务器响应

Netty http服务器响应,http,netty,Http,Netty,这可能很简单,但我想不出来。我的基于Netty 4的http服务器导致http客户端挂起其响应。它设法通过其响应负载发送(使用curl作为客户机观察到),但客户机似乎没有意识到响应已经完成,他们无限期地等待它完成。使用curl、firefox和chrome进行观察 只有修改代码以关闭通道(channel.close,如下面内联所示),客户端才会确认响应已完成。否则,他们只是继续等待它完成。我希望通道保持打开状态,以便下一个客户端请求不需要打开新连接(我希望保持活动状态),因此关闭通道似乎不太可能

这可能很简单,但我想不出来。我的基于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帮助器类来完成它,但这是您需要自己处理的事情。