经调试发现接收数据部分有两个小问题点。
来源: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回答
-
如果设置为最小值是可以,但是会出现后续内容到达扩容的问题,其效率会更低一些
这里是当前程序的情况,但实际上我们期望的是args在接收数据的时候不光是能接收到头部数据,还应该包含部分Body数据,这样并发才能上升,只是我们的程序因为时长原因没有去实现这个部分而已。
如果我们在后续的写操作上做了区别对待将会导致这样的可扩展性丢失。
012020-06-24
相似问题