繁体   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