繁体   English   中英

Java套接字非阻塞读取

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM