![](/img/trans.png)
[英]Java - Multiple selectors in multiple threads for nonblocking sockets
[英]Java Sockets nonblocking read
我正在使用DataInputStream从套接字读取字符/数据。
我想使用.readUnsignedShort(); 如果没有要读取的2个字节,则抛出异常。 我应该继承DataInputStream并覆盖添加异常的方法,还是有更简单的方法?
如果你想要快速和脏的东西,请尝试inputStream.available() 。
if (stream.available() < 2) {
// throw it
}
如果您希望在数据可用时进行真正的非阻塞读取和回调,我认为Pablo的答案更好。
我认为Java NIO非阻塞类是您的最佳选择。 检查SocketChannel类及其相关代码示例。
但是要小心,当你发出你的读命令时,可能是字节不可用的情况,但这并不意味着它永远不会到达你的套接字......
void readButDoNotBlockForALongTime(java.net.Socket socket) {
int someTimeout = 1000;
socket.setSoTimeout(someTimeout);
try {
// read as much as you want - blocks until timeout elapses
} catch (java.net.SocketTimeoutException e) {
// read timed out - you may throw an exception of your choice
}
}
这是一种只在你想要的时候阻止的简单方法。
setSoTimeout(int timeout):使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。 如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。 必须在进入阻止操作之前启用该选项才能生效。 超时必须> 0.超时为零被解释为无限超时。
要获得更优雅的解决方案,您可以考虑使用NIO。
如果输入在提供两个字节之前结束,则会抛出EOFException。 如果没有可用的输入()将返回零,虽然它也可以返回零,如果有在某些情况下(如SSL)输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.