我想为多个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
答案 0 :(得分:0)
你完全受客户的支配。如果它们实现连接池,则将重用您的连接。如果没有,不是。除了观察并实现Connection: close
标头(如果已发送),您无法在服务器端执行任何操作。