java - 从 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,混合模式)
谢谢。
解决方案
这是意料之中的,也是 TCP 的工作原理。TCP 没有消息边界的概念,因此您可能会在读取字节时收到它们(这意味着内容可能会被分段等)。
如果您需要保留某种消息边界,则需要在协议中对此信息进行编码。例如,您可以预先添加消息的长度,然后在接收对等方上使用此信息来正确解码消息。
Netty 本身包含一些解码器/编码器
推荐阅读
- ios - 根据indexpath更新UITableView中的progressView
- html - 如何在内联样式背景图像上显示 CSS 背景颜色
- bash - Bash 使用源代码加载配置文件
- c# - C# 如何在 LINQ 查询中访问 SelectListItem 的 Selected 属性的值?
- sql - sql左连接问题没有给出右表不匹配的结果
- ajax - 单元侦听器启动多个请求
- apache-spark - Spark 忽略执行器和驱动程序内存的配置
- sql - 如何在用作存储过程输入的临时表上使列可选?
- python - Python 2.7 OpenCV matchTemplate,只获取最佳匹配
- angular - 如何在运行时设置 .scss 变量值?