[英]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() 返回行的開頭。 如何一次獲取完整數據?
我很確定問題已得到解答,但我自己沒有找到解決方案。 請通過給出答案或相關問題的鏈接來幫助我
注意:我注意到我從緩沖區中獲得的字符數與發送到的字符數一樣多。 所以,我認為問題在於緩沖能力。
兩個問題:
調用write
后,您應該調用flush
(在這兩種情況下)。
當您讀取服務器的響應(在客戶端)時,您正在使用相同的緩沖區,該緩沖區可能不足以容納整個答案。 您使用的緩沖區大小是您在此行中創建的初始緩沖區的大小:
ByteBuffer.wrap(msg.getBytes());
嘗試用這些建議改進它,看看會發生什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.