重用HTTP请求的频道

时间:2015-04-19 07:26:46

标签: java netty

我想为多个HTTP请求重用通道。我使用java + netty作为服务器,但客户端可以用C#/ Java编写。

对于C#客户端,我使用HttpWebRequest KeepAlive = true;并且在响应到达后我不会关闭频道。它完美无缺。

但是当我尝试使用相同的java< - > java通信我遇到了一些问题。我正在处理来自服务器的响应,例如this示例和this客户端部分。

如果在if (msg instanceof LastHttpContent) {部分,我只是ctx.close();我无法重新使用此频道。我该怎么做才能重复使用它?

我试过了:

ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE));

ctx.writeAndFlush(Unpooled.EMPTY_BUFFER);

或者试图什么都不做......但是当我尝试重用这个频道时,我在这个句柄中遇到了问题。第一个请求处理得很好,但第二个请求给了我这个错误:

channelRead0: DefaultHttpResponse(decodeResult: failure(java.lang.NullPointerException), version: HTTP/1.1)

部分if (msg instanceof HttpResponse)工作正常(我的意思是读取了标题),但在此之后的某处抛出了异常。

headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);

也没有帮助。说清楚:第一个请求/响应是好的。同一个流中的第二个请求很好,但是在解码响应时存在问题。

我检查了Logger。第一个和第二个响应是相同的,所以我不明白为什么它在解码时会出现NullException。

P.S。 netty 4.0.26

1 个答案:

答案 0 :(得分:0)

你完全受客户的支配。如果它们实现连接池,则将重用您的连接。如果没有,不是。除了观察并实现Connection: close标头(如果已发送),您无法在服务器端执行任何操作。