Java 如何从&;正确地写信给ByteBuffer吗?

Java 如何从&;正确地写信给ByteBuffer吗?,java,server,buffer,nio,socketchannel,Java,Server,Buffer,Nio,Socketchannel,我无法从byteBuffer获取所有数据。 我必须采取以下方法: 客户端: public String sendMessage(String msg) { buffer = ByteBuffer.wrap(msg.getBytes()); String response = null; try { client.write(buffer); buffer.clear(); cl

我无法从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;
    }
服务器端(还有另一种方法可以接受客户机并使用选择键,我不考虑):

当我调用sendMessage()并在这个方法中从服务器获取数据时,我只接收到一小段数据(例如,我只从原始字符串“Example message”中获取“Examp”)。只有当我再次调用sendMessage()时,我才会收到该行的其余部分(同样是单独的,我需要调用sendMessage()几次)。当我到达行的末尾时,它开始循环,下一次调用sendMessage()返回行的开始。如何一次获取完整数据

我很确定这个问题已经得到了回答,但我自己没有找到解决办法。请给出答案或相关问题的链接来帮助我

注意:我注意到我从缓冲区得到的字符数和我发送到的字符数一样多。因此,我认为问题在于缓冲容量。

两个问题:

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

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

     ByteBuffer.wrap(msg.getBytes());
    

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

    谢谢你的解释。事实上,问题之一是缓冲区的大小。我通过使用两个不同的缓冲区解决了这个问题(一个是我从客户端传递的,另一个是我从服务器传递的,作为对客户端的响应)。现在它可以按预期工作(不确定是否更好),但我仍然对只使用一个缓冲区感到困惑。我尝试了不同的方法(例如,清洁、调整大小、压缩等)。如果您能给我一个示例或源代码,我将不胜感激。一旦您分配了缓冲区,它就无法重新调整大小(一旦您分配了缓冲区,它的容量是恒定的)。你可以使用“限制”之类的东西(为了改变可能使用的实际尺寸),但我不确定这是你现在应该处理的事情。这里的主要问题是理解应该使用具有足够空间的缓冲区。如果还有其他具体问题,请提问。
     ByteBuffer.wrap(msg.getBytes());