首页 > 解决方案 > 从 netty 服务器读取时,不同的响应消息正在合并

问题描述

我有一个 netty 客户端应用程序。此应用程序正在连接到端口并检索 tcp 响应。当我在负载下阅读响应时,一些响应消息正在连接。我的请求和响应消息具有唯一的事务密钥。我正在关注我的业务逻辑;

实际:000010690013200000101PMAX 567F 0000000000 1554092081842400 0 000010690013200000101PMAX 567F 0000000000 1556083801080400 0

预期:000010690013200000102PMAX 567F 0000000000 1554092081842400 0

重复响应有 2 个响应,但服务器仅发送 1 个响应,我们在阅读时汇总了它

@Override
public void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf in) {
    String input = in.toString(CharsetUtil.UTF_8);
    log.info(input);
}

我该如何解决这个问题,它是在负载下发生的。

Netty 版本:4.1.25.Final Java 版本:OpenJDK 64-Bit Server VM(build 25.161-b14,混合模式)

谢谢。

标签: javatcpnetty

解决方案


这是意料之中的,也是 TCP 的工作原理。TCP 没有消息边界的概念,因此您可能会在读取字节时收到它们(这意味着内容可能会被分段等)。

如果您需要保留某种消息边界,则需要在协议中对此信息进行编码。例如,您可以预先添加消息的长度,然后在接收对等方上使用此信息来正确解码消息。

Netty 本身包含一些解码器/编码器

LengthFieldPrepender

LengthFieldBasedFrameDecoder


推荐阅读