0
    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 字节的数据。在这种情况下,所有消息都被合并,最后一条消息没有完全到达。如何在消息分隔符“|”之前将数据读入缓冲区 ? 我想单独接收每条消息。

4

2 回答 2

0

TCP 中没有消息之类的东西。它是一个字节流 API。如果你想要消息,你必须自己实现它们,通过分隔符、STX/ETX 对、长度词前缀、自描述协议等。

于 2012-06-28T22:07:16.950 回答
0

取决于协议,但如果协议基于消息分隔符,您唯一的选择是在不阻塞的情况下尽可能多地阅读,然后扫描您阅读的内容以找到分隔符。您需要循环执行此操作,直到连接关闭(或直到您的一方决定关闭连接)。

当然,您可以一次阅读多条消息,甚至是部分消息,因此您必须确保充分处理这些情况。

于 2012-06-28T17:47:21.767 回答