前言
在前一章记录了如何使用netty作为TCP通信的服务端:点击前往 ,本章记录一下如何解决硬件设备在接收到服务端发送过来的消息时有连包的问题。
问题描述
在通过监测硬件的收包信息时发现偶尔会出现心跳包和指令“粘”在一块的情况,例如指令的发送内容是:EEFF0103GGHH
,心跳包的回复是:EEFF0201GGHH
。
当心跳包返回信息的时候此时正好指令下发,那么设备端就会收到:EEFF0103GGHHEEFF0201GGHH
。
这是由于调用netty的writeAndFlush()
方法时并不是马上将数据发送过去,而将它放在一个缓冲池当中,而由于硬件的一发一收通信机制客户端无法对连包的数据做分割,因此这个问题要由服务端解决。
解决办法
找遍了谷歌、官方文档等资料就是没有说明连包问题的相关资料,大部分资料都是说明如何解决服务端接收TCP消息时产生的粘包、半包等问题。
最终发现原来netty配置中有个ChannelOption.TCP_NODELAY
选项,官网上没有任何介绍,根据名字可知意思为“无延迟TCP”,于是启动类代码修改为如下:
1 | //创建线程组 |
关键代码在于.childOption(ChannelOption.TCP_NODELAY, true)
,最终通过抓包发现未在出现连包的情况。
由于我这边的特殊情况,在发送消息时我还加了一层保障,防止心跳回复与指令冲突,示例代码如下:
1 | /** |
- 本文作者: reiner
- 本文链接: https://reiner.host/posts/d0c795f9.html
- 版权声明: 转载请注明出处,并附上原文链接