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字节的数据。在这种情况下,所有消息都被组合在一起,并且最后一条消息没有完全消失。如何在消息分隔符“|”之前将数据读入缓冲区?我希望单独收到每封邮件。
答案 0 :(得分:0)
取决于协议,但如果协议基于消息分隔符,则唯一的选择是尽可能多地读取而不阻塞,然后扫描您阅读的内容以查找分隔符。您需要循环执行此操作,直到连接关闭(或直到您的一方决定关闭连接)。
当然,您可以一次阅读多条消息甚至是部分消息,因此您必须确保充分处理这些情况。
答案 1 :(得分:0)
TCP中没有消息。它是一个字节流API。如果你想要消息,你必须自己实现它们,通过分隔符,STX / ETX对,长度字前缀,自描述协议等。