Java NIO SocketChannel读取预定义字节数

Java NIO SocketChannel读取预定义字节数,java,nio,bytebuffer,socketchannel,Java,Nio,Bytebuffer,Socketchannel,我有一个JavaNIOSocket服务器 服务器正在从远程客户端获取JSONObjects。 我正在使用SocketChannel.read(ByteBuffer)方法来读取通道。 每条消息都以“\n”结尾,这标志着当前消息的结束 我的问题是,有时read()方法读取更多字节并到达“\n”之后。。 是否有一种方法可以让我从SocketChannel读取,直到找到“\n”为止?我考虑过逐字节读取(我只是找不到关于如何实现它的文档…) 任何其他解决方案?处理从字节缓冲区到并包括“\n”的字节,因此缓

我有一个JavaNIOSocket服务器

服务器正在从远程客户端获取
JSONObjects
。 我正在使用
SocketChannel.read(ByteBuffer)
方法来读取通道。 每条消息都以“\n”结尾,这标志着当前消息的结束

我的问题是,有时
read()
方法读取更多字节并到达“\n”之后。。 是否有一种方法可以让我从
SocketChannel
读取,直到找到“\n”为止?我考虑过逐字节读取(我只是找不到关于如何实现它的文档…)


任何其他解决方案?

处理从字节缓冲区到并包括“\n”的字节,因此缓冲区的位置是“\n”之后的第一个字节,然后调用。任何超过“\n”的字节都将保留在缓冲区中,下一次读取将附加到它们。

这不是一个坏主意,但我考虑将剩余的数据保留在SocketChannel中以供读取,这样选择器将发现这些是稍后要读取的新消息。。这一点很重要,因为我的服务器的机制是,对于每条消息,将执行线程池中的一个线程。要做到这一点,正如您所建议的,您可能必须一次读取一个字节,我认为这不会有好的性能。我认为,在每次读取消息后,您需要在缓冲区中查找“\n”,而不是依赖SelectionKey的可读性来知道何时有消息。您可能无论如何都必须这样做,因为批量读取永远不能保证在一次调用中读取整行(甚至可以读取多行)。