经调试发现接收数据部分有两个小问题点。

来源:8-9 消息粘包与消息不全测试

none_nkn

2020-06-23

问题1:AsyncReceiveDispatcher的assemblePacket()方法,首份IoArgs时,buffer = new byte[length]的问题。
使用length与ioArgs容量两者的最小值好像更合适些。即:
int bufferSize = Math.min(length, ioArgs.capacity());
buffer = new byte[bufferSize];

问题2:syncReceiveDispatcher的assemblePacket()方法,首份IoArgs时,其内部只携带了头部长度数据(原因:首份IoArgs时listener.onStarted()方法设置了limit为4,只从SocketChannel读取4个字节的头部数据),readLength拿到头部数据之后(position=limit=4),接下来int count = args.writeTo(buffer, 0);会出现读不到,count返回0,即解析首份IoArgs时实际只读取了头部长度信息而读不到数据体部分的数据。因此是否可做成如果是首份IoArgs时就不要执行args.writeTo了?

写回答

1回答

Qiujuer

2020-06-24

  1. 如果设置为最小值是可以,但是会出现后续内容到达扩容的问题,其效率会更低一些

  2. 这里是当前程序的情况,但实际上我们期望的是args在接收数据的时候不光是能接收到头部数据,还应该包含部分Body数据,这样并发才能上升,只是我们的程序因为时长原因没有去实现这个部分而已。

  3. 如果我们在后续的写操作上做了区别对待将会导致这样的可扩展性丢失。

0
1
none_nkn
非常感谢!
2020-06-24
共1条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2316 学习 · 476 问题

查看课程