2012-12-23 30 views
0

我有一个Java NIO套接字服务器。Java NIO SocketChannel读预定义字节数

服务器从远程客户端获得JSONObjects。 我使用的是SocketChannel.read(ByteBuffer)方法以便从通道读取。每个消息以'\ n'结尾,标记当前消息的结尾。

我的问题是,有时read()方法来读取更多的字节和“\ n”后到达.. 有没有办法对我来说,从SocketChannel只有等到“\ n”读发现?我想可能是逐字节读取(我只是找不到文件如何实现它..)?

其他解决方案?

回答

2

处理ByteBuffer中的字节直到'\ n',因此缓冲区的位置是'\ n'后的第一个字节,然后调用ByteBuffer.compact()。任何超过'\ n'的字节将保留在缓冲区中,下一次读取将附加到它们。

+0

这不是一个坏主意,但我想留下SocketChannel内剩余的数据来阅读,所以选择器会发现这是新的消息以后阅读..这很重要,因为我的服务器机制是为每条消息 - 线程池中的一个线程将执行 –

+0

要做到这一点,您可能会按照您的建议一次读取一个字节,我认为这样会导致性能不佳。我认为,不要依赖SelectionKey的可读性来了解何时有消息,每次读取后都需要在缓冲区中查找'\ n'。无论如何,你可能必须这样做,因为批量读取不会保证在一个调用中读取整行(甚至可以读取多行)。 – VGR