采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
图片描述
老师你看,这里有个疑惑,就是我发送的数据长度是30,但是我的IoArgs的buffer的capacity只有5,它是怎么把30的数据装到只有5的buffer中去的呢,明明装不下啊,想不通
这里是这样的哈,capacity是5,等于容量为5;30字节放进去的时候其实仅仅放了一部分也就是头5个字节;然后发送。
之后再取第6~10的字节又放进去发送,依次循环,直到全部发送。
并不是一次放进去完全的。
try { // 具体的读取操作 if (args.writeTo(channel) > 0) { // 读取完成回调 listener.onCompleted(args); } else { throw new IOException("Cannot write any data!"); } } catch (IOException ignored) { CloseUtils.close(SocketChannelAdapter.this); } @Override public void onCompleted(IoArgs args) { // 继续发送当前包 sendCurrentPacket(); } 嗯,是通过这个回调循环起来的是吧,然后假如去取6~10字节的时候,前5个字节的数据其实是已经发出去了,服务端已经能收到前5个字节的数据了是吗,因为在每次sendCurrentPacket()时都会恢复已经注册了的对WRITE的监听
是通过这个循环来的,至于是否已经被流程接收到数据并不确定,取决于接收方的网卡状态与缓存。但是数据是已经到了链路层传输了。
嗯,好的
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
2.7k 1
1.8k 7
1.6k 5
1.9k 13
1.0k 13