我正在使用一台服务器,该服务器必须拥有数百个挂起的tcp连接,每个连接很少发送/接收实际数据。我宁愿使用基于非阻塞/基于选择器的java.nio套接字来执行此操作,而不要在应用程序中具有数百个阻塞线程。
从java.nio中,我可以看到SocketChannel和一个信号。其int .read(ByteBuffer dst)方法将可用的字节数读入ByteBuffer。
我希望我的客户发送消息,每行一条消息,以\n
字符结尾。
很明显,读操作可能只生成消息的一部分,一次甚至生成多个消息都已完成和未完成。此外,ByteBuffer的操作对象是字节,而不是字符,因此读取操作可能还会产生不完整的字符串,其中包含拆分的UTF-8字符。
我现在正在寻找一种将读取的字节写入Buffer-Structure的方法,然后可以从其中读取完整的行,但是当UTF-8字符或Line尚未完全到达时,它不会阻塞。
java.io的PipedOutputStream / PipedInputStream以及InputStreamReader和BufferedReader几乎满足了这些要求,但是它们以某种方式阻塞了,即调用{{3}如果输入中存在未完成的UTF-8字符或行,则BufferedReader上的}或int .read()将会阻塞。
我现在正在寻找可以无阻塞运行的最干净的等效设备。任何依赖关系,Apache Commons或其他第三方的依赖关系都可以。
这是一个入门的基本非阻塞服务器示例:String .readLine()