[英]Java SocketChannel read the messages of unknown length
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int numRead = -1;
try {
numRead = channel.read(buffer);
System.out.println("numRead: " + numRead);
}
catch (IOException e) { e.printStackTrace();}
if (numRead == -1) {
this.dataMap.remove(channel);
Socket socket = channel.socket();
SocketAddress remoteAddr = socket.getRemoteSocketAddress();
System.out.println("Connection closed by client: " + remoteAddr);
channel.close();
key.cancel();
return;
}
System.out.println("Got: " + new String(buffer.array(), "windows-1251"));
從套接字讀取1024字節的數據。 在這種情況下,所有消息都會合並,而最后一條消息不會完全出現。 如何在消息分隔符“ |”之前將數據讀入緩沖區 ? 我想分別接收每個消息。
取決於協議,但是如果協議基於消息分隔符,則您唯一的選擇是在不阻塞的情況下盡可能多地讀取內容,然后瀏覽所讀取的內容以查找分隔符。 您需要循環執行此操作,直到關閉連接(或直到您的一方決定關閉連接)為止。
當然,您可以一次閱讀多條消息,甚至可以閱讀部分消息,因此必須確保充分處理這些情況。
TCP中沒有消息。 它是一個字節流API。 如果需要消息,則必須通過分隔符,STX / ETX對,長度字前綴,自描述協議等自己實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.