我正在开发一个服务器,它必须拥有数百个挂起的 tcp 连接,每个连接都很少传输/接收实际数据。我更喜欢使用基于非阻塞/选择器的 java.nio 套接字来执行此操作,而不是在我的应用程序中使用数百个阻塞线程。
从 java.nio 我得到一个可读的SocketChannel和一个 Signal 。它的int .read(ByteBuffer dst)方法将可用的字节数读取到ByteBuffer中。
我希望我的客户发送消息,每行一条消息,以\n
字符结尾。
显然,一个读操作可能一次只产生一个消息的一部分,一个已完成的和一个未完成的甚至多个消息。此外,ByteBuffer 对字节而不是字符进行操作,因此读取操作也可能会产生一个带有拆分 UTF-8 字符的不完整字符串。
我现在正在寻找一种将读取的字节写入缓冲区结构的方法,然后我可以从中读取完整的行,但是当 UTF-8 字符或行尚未完全到达时,它不会阻塞。
java.io 的PipedOutputStream / PipedInputStream以及InputStreamReader和BufferedReader几乎可以满足这些要求,但它们在某种程度上是阻塞的,如果未完成的 UTF-8,在 BufferedReader 上调用int .read()或String .readLine()将阻塞输入中存在字符或行。
我现在正在寻找可以无阻塞运行的最干净的等效项。任何依赖项、Apache Commons 或其他 3rd-Party 依赖项都可以。
这是一个入门的基本非阻塞服务器示例:https ://gist.github.com/MaZderMind/12fe3b370e654f31ea22aaa540f5a741