Java 在netty中处理HTTP客户端异常

Java 在netty中处理HTTP客户端异常,java,http,netty,Java,Http,Netty,我对内蒂比较陌生,不确定自己是否做对了事情。我会尽量简短。如果有任何不清楚的地方,请询问更多信息 因此,我有一个netty服务器来服务HTTP请求,其中的内容应该是序列化为Json字符串的protobuf消息 通道管道如下所示: @Override protected void initChannel(final SocketChannel channel) throws Exception { final ChannelPipeline pipeline = channel.pipel

我对内蒂比较陌生,不确定自己是否做对了事情。我会尽量简短。如果有任何不清楚的地方,请询问更多信息

因此,我有一个netty服务器来服务HTTP请求,其中的内容应该是序列化为Json字符串的protobuf消息

通道管道如下所示:

@Override protected void initChannel(final SocketChannel channel) throws Exception {
    final ChannelPipeline pipeline = channel.pipeline();
    pipeline.addLast(new HttpServerCodec());
    pipeline.addLast(new HttpObjectAggregator(1048576));
    pipeline.addLast(new HttpProtobufServerCodec(charset, requestConverter, responseConverter));
    pipeline.addLast(new ProtobufMessageHandler(mapping));
}
前两个通道处理程序是标准的netty处理程序

HttpProtobufServerCodec看起来像:

public class HttpProtobufServerCodec extends CombinedChannelDuplexHandler<HttpToProtobufDecoder, ProtobufToHttpEncoder>
客户端在读取响应正文时超时。但如果我在写完400后关闭频道,一切都会好起来。发生的事情是;由于没有可用的输入数据,因此无法读取输入流。也就是说,我们陷入了困境。请阅读下面的(…),在客户机代码深处的某个地方:

while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
        byteCount += bytesRead;
    }
所以,问题是,在出于某种原因编写http 400响应之后,您是否有关闭通道的权限

我这样做对吗?我应该在exceptionCaught中写入HTTP响应消息吗

对不起,如果问题有点不清楚。任何帮助都将不胜感激


/谢谢

客户端无法知道您的消息何时已完全发送。添加一个内容长度或分块标题,您将不再需要关闭连接

客户端无法知道您的消息何时已完全发送。添加一个内容长度或分块标题,您将不再需要关闭连接

谢谢!我自己也得出了这个确切的结论。很高兴得到确认。我想HttpServerCodec会/应该处理这个问题。谢谢!我自己也得出了这个确切的结论。很高兴得到确认。我觉得HttpServerCodec会/应该处理这个问题。
//ctx.writeAndFlush(response);
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
        byteCount += bytesRead;
    }