如何正确读写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() 并在此方法中从服务器获取数据时,我只收到一小段数据(例如,我只从原始字符串“Example message”中获取“Examp”)。只有当我再次调用 sendMessage() 时,我才会收到该行的其余部分(另外,我需要多次调用 sendMessage() )。一旦我到达该行的末尾,它就开始循环,下一个调用 sendMessage() returns 开始该行。如何一次获取完整数据?
我很确定问题已经得到解答,但我自己没有找到解决方案。请通过给出相关问题的答案或 link 来帮助我
注意:我注意到我从缓冲区中获取的字符数与发送到的字符数一样多。所以,我认为问题出在缓冲能力上。
两个问题:
在调用 write
之后,您应该调用 flush
(在这两种情况下)。
当您读取服务器的响应(在客户端)时,您使用的是同一个缓冲区,它可能不足以容纳整个答案。您使用的缓冲区大小是您在此行中创建的初始缓冲区的大小:
ByteBuffer.wrap(msg.getBytes());
尝试根据这些建议改进它,看看会发生什么。
我无法从 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() 并在此方法中从服务器获取数据时,我只收到一小段数据(例如,我只从原始字符串“Example message”中获取“Examp”)。只有当我再次调用 sendMessage() 时,我才会收到该行的其余部分(另外,我需要多次调用 sendMessage() )。一旦我到达该行的末尾,它就开始循环,下一个调用 sendMessage() returns 开始该行。如何一次获取完整数据?
我很确定问题已经得到解答,但我自己没有找到解决方案。请通过给出相关问题的答案或 link 来帮助我
注意:我注意到我从缓冲区中获取的字符数与发送到的字符数一样多。所以,我认为问题出在缓冲能力上。
两个问题:
在调用
write
之后,您应该调用flush
(在这两种情况下)。当您读取服务器的响应(在客户端)时,您使用的是同一个缓冲区,它可能不足以容纳整个答案。您使用的缓冲区大小是您在此行中创建的初始缓冲区的大小:
ByteBuffer.wrap(msg.getBytes());
尝试根据这些建议改进它,看看会发生什么。