繁体   English   中英

如何正确读取和写入 ByteBuffer?

[英]How to read from & write to ByteBuffer correctly?

我无法从 byteBuffer 获取所有数据。 我必须采用以下方法:

客户端:

public String sendMessage(String msg) {
        buffer = ByteBuffer.wrap(msg.getBytes());
        String response = null;
        try {
            client.write(buffer);
            buffer.clear();
            client.read(buffer);
            response = new String(buffer.array()).trim();
            System.out.println("response=" + response);
            buffer.clear();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

服务器端(还有另一种接受客户端并使用选择键的方法,我将其省略):

private static void serverResponse(ByteBuffer buffer, SelectionKey key) throws IOException {
        SocketChannel client = (SocketChannel) key.channel();
        client.read(buffer);
        if (new String(buffer.array()).trim().equals("exit")) {
            client.close();
        }
        else {
            ByteBuffer responseBuffer = ByteBuffer.wrap("Example message".getBytes());
            client.write(responseBuffer);
            responseBuffer.clear();
        }
    }

当我在此方法中调用 sendMessage() 并从服务器获取数据时,我只收到一小部分数据(例如,我只从原始字符串“示例消息”中获得“示例”)。 只有当我再次调用 sendMessage() 时,我才会收到该行的 rest(另外,我需要调用 sendMessage() 几次)。 一旦我到达行尾,它就开始循环,下一次调用 sendMessage() 返回行的开头。 如何一次获取完整数据?

我很确定问题已得到解答,但我自己没有找到解决方案。 请通过给出答案或相关问题的链接来帮助我

注意:我注意到我从缓冲区中获得的字符数与发送到的字符数一样多。 所以,我认为问题在于缓冲能力。

两个问题:

  1. 调用write后,您应该调用flush (在这两种情况下)。

  2. 当您读取服务器的响应(在客户端)时,您正在使用相同的缓冲区,该缓冲区可能不足以容纳整个答案。 您使用的缓冲区大小是您在此行中创建的初始缓冲区的大小:

     ByteBuffer.wrap(msg.getBytes());

尝试用这些建议改进它,看看会发生什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM