簡體   English   中英

Java SocketChannel讀取長度未知的消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM