2013-02-20 217 views
2

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

仅当我修改代码以关闭通道(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

您是否正在发送内容长度标题? – Kylar 2013-02-20 15:43:53

+0

不是,我没有积极添加任何标题。我是不是该? – matanster 2013-02-20 16:43:49

+1

是的。如果没有Content-Length标题,客户不知道何时停止阅读。如果您的内容只是“你好”,然后添加:Content-Length:5. – Kylar 2013-02-20 16:47:41

回答

2

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