Java套接字非阻塞读取

Java套接字非阻塞读取,java,sockets,Java,Sockets,我使用DataInputStream从套接字读取字符/数据 我想使用.readUnsignedShort();如果没有2个字节可读取,则让它抛出异常。我应该为DataInputStream子类化并覆盖添加异常的方法,还是有更简单的方法?我认为Java NIO非阻塞类是最好的选择。检查类及其相关代码示例 但是要小心,当您发出read命令时,可能是字节还不可用,但这并不意味着将永远不会到达您的套接字…如果您想要快速脏的东西,请尝试 if(stream.available()我通过Google“非阻塞

我使用DataInputStream从套接字读取字符/数据


我想使用.readUnsignedShort();如果没有2个字节可读取,则让它抛出异常。我应该为DataInputStream子类化并覆盖添加异常的方法,还是有更简单的方法?

我认为Java NIO非阻塞类是最好的选择。检查类及其相关代码示例


但是要小心,当您发出read命令时,可能是字节还不可用,但这并不意味着将永远不会到达您的套接字…

如果您想要快速脏的东西,请尝试

if(stream.available()<2){
//扔掉它
}

如果您希望在数据可用时进行真正的非阻塞读取和回调,我认为Pablo的答案更好。

如果输入在提供两个字节之前结束,它将抛出EOFEException。如果没有可用的输入(),则()将返回零,但如果在某些情况下(例如SSL)有输入,它也可以返回零

这是一种简单的方法,可以阻止你想阻止多久就阻止多久

setSoTimeout(int timeout):使用指定的超时启用/禁用SO_超时,以毫秒为单位。将此选项设置为非零超时时,对与此套接字关联的InputStream的read()调用将仅阻塞此时间量。如果超时过期,则会引发java.net.SocketTimeoutException,尽管套接字仍然有效。在进入阻塞操作之前,必须启用该选项才能生效。超时必须大于0。零超时被解释为无限超时


一个更优雅的解决方案,你可以考虑使用NIO。< /P>我通过Google“非阻塞套接字”找到这一点,但我真正想要的是在不阻塞线程的情况下对套接字进行查询。这么简单,谢谢。我不认为每1000毫秒抛出一个异常并捕获一个异常是优雅的。这比打开DOS攻击程序要好,但使用NIO会更好。我同意,@StealthRabbi。删除“优雅”一词。:)

if (stream.available() < 2) {
    // throw it
}
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
    }
}