gpt4 book ai didi

java - Netty ChannelRead 未获取完整消息

转载 作者:行者123 更新时间:2023-12-01 07:55:11 25 4
gpt4 key购买 nike

为什么channelRead()不给我发送到服务器的完整消息?当消息超过 140 字节(粗略地说,有时更多,有时更少)时,有时会出现碎片。我正在使用 NioServerSocketChannel 类的 TCP 套接字。

我使用的是4.1.0.Beta5。

有没有办法在消息到达时阅读完整消息?

this.serverBootstrap = new ServerBootstrap();
this.serverBootstrap.group(new NioEventLoopGroup(1), new NioEventLoopGroup(6))
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>()
{
@Override
public void initChannel(SocketChannel ch) throws Exception
{
ch.pipeline().addLast(new TestServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, (int)Short.MAX_VALUE)
.option(ChannelOption.SO_RCVBUF, (int) Short.MAX_VALUE)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(ChannelOption.TCP_NODELAY, true);
this.serverBootstrap.bind(this.host, this.port);

TestServerHandler 类扩展了 ChannelInboundHandlerAdapter:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {

String s = buffer.toString(CharsetUtil.UTF_8);

for(int i = 0; i < 20; i++)
{
s = s.replace("[" + ((char)i) + "]", i + "");
}

System.out.println(s.length() + "");
System.out.println();
System.out.println();
System.out.println(s);
}

我需要一种方法来获取完整的 bytebuf/bytearray,当它完全到达服务器时并得到通知,以便我的应用程序可以根据客户端发送的数据以正确的方式响应。

简而言之:如何防止碎片并让channelRead事件输出整个消息/bytebuf。

最佳答案

Netty使用的基本数据类型是Channel Buffers或ByteBuf。这只是字节的集合,仅此而已。在您的代码中,您只需使用自定义处理程序来处理原始传入数据。这通常不是一个好的做法。一个非常基本的 Netty 管道应该如下所示

enter image description here

因此管道由解码器/编码器组成,然后我们有自定义处理程序或日志处理程序。我们从来没有真正按原样处理任何原始数据。 TCP是一种流协议(protocol)。它不识别特定数据包何时结束以及新数据包何时开始。即使我们发送一个非常非常大的数据包或说两个单独的数据包,它们也只会被视为一组字节,当我们尝试读取原始字节集时,可能会发生碎片

因此,正确实现由字符串解码器/编码器(无论您需要什么)组成的 channel 管道,这个问题就会消失。

关于java - Netty ChannelRead 未获取完整消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31327443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com