Java 如何从&;正确地写信给ByteBuffer吗?
我无法从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
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());