gpt4 book ai didi

java nio socketChannel 读取总是返回相同的数据

转载 作者:行者123 更新时间:2023-12-01 06:24:47 25 4
gpt4 key购买 nike

在客户端,阅读代码:

byte[] bytes = new byte[50]; //TODO should reuse buffer, for test only
ByteBuffer dst = ByteBuffer.wrap(bytes);
int ret = 0;
int readBytes = 0;
boolean fail = false;
try {
while ((ret = socketChannel.read(dst)) > 0) {
readBytes += ret;
System.out.println("read " + ret + " bytes from socket " + dst);
if (!dst.hasRemaining()) {
break;
}
}
int pos = dst.position();
byte[] data = new byte[pos];
dst.flip();
dst.get(data);
System.out.println("read data: " + StringUtil.toHexString(data));
} catch (Exception e) {
fail = true;
handler.onException(e);
}

问题是socketChannel.read()总是返回正值,我检查了返回缓冲区,数据重复了N次,它就像低层套接字缓冲区的位置没有向前移动。有什么想法吗?

最佳答案

如果服务器仅返回 48 个字节,则您的代码一定在尝试获取第 49 和 50 个字节的 read() 方法中被阻塞。因此,要么您的“50”是错误的,要么您必须重组代码以读取和处理您获得的任何内容,而不是首先尝试填充缓冲区。这不可能是您认为总是获得相同数据的代码。对此的解释是,如果您在下一次读取中重用相同的缓冲区(您应该这样做,但您发布的代码没有这样做),则在获取之后无法压缩缓冲区。

关于java nio socketChannel 读取总是返回相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com