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

标签 java nio bytebuffer socketchannel

在客户端,阅读代码:

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/

相关文章:

ios - Swift 4 中的 Java ByteBuffer 等效项

java - 如何从文件中的相对路径构造文件

Java Glass Pain(这不是拼写错误)

java - 对一些java语法感到困惑

java - "Could Not Find or Load Main Class..."

java bufferedReader.readLine() 无法读取整个文件行

java - 有没有办法让 Java 应用程序获得 root 权限?

java - 将内容导入到分配的 ByteBuffer 中

java - ByteBuffer:写入,然后返回到缓冲区的开头,并在之前写入的所有数据之前写入(前置?)

java - Spring: Autowiring 字段为空