Java 为什么使用Socket.setSoTimeout()不起作用?

Java 为什么使用Socket.setSoTimeout()不起作用?,java,android,sockets,tcp,tcpclient,Java,Android,Sockets,Tcp,Tcpclient,此代码段来自我在Android java中创建的TCP助手函数: socket.setSoTimeout(2000); InputStream inStream = socket.getInputStream(); PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),

此代码段来自我在Android java中创建的TCP助手函数:

            socket.setSoTimeout(2000);
            InputStream inStream = socket.getInputStream();
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),
            true);

            out.println(message);

            BufferedReader input = new BufferedReader(new InputStreamReader(inStream));

            String tcpResult = "";

            if(lastCallMillis >= System.currentTimeMillis() - 100)
                Thread.sleep(100);

            tcpResult = input.readLine();
当第一行出现时,即带有“setSoTimeout”的那一行,该方法将失败并出现异常。 当我没有设置超时时,它会正常工作

嗯。。几乎我必须插入此部件,因为如果插座连续快速使用,则会失败:

            if(lastCallMillis >= System.currentTimeMillis() - 100)
            Thread.sleep(100);

不管怎样,我是不是误解了java套接字的使用,还是它的支持太差了?

如果您不希望快照读取超时,请不要设置较短的读取超时。将睡眠添加到网络代码中并不能解决任何问题。这简直是浪费时间。您应该做的是将睡眠时间添加到超时中。但对于读取超时来说,即使是2.1秒也短得可笑。尝试十次或三十次。

您知道连接超时与设置超时不同吗?setSoTimeout将在给定毫秒内阻止read()调用。如果超时过期,将引发java.net.SocketTimeoutException,但套接字仍然有效。谢谢,我现在也在创建套接字时设置了连接超时。奇怪的是,增加超时有效。我说奇怪是因为不管有没有超时,操作都只需要不到一秒钟的时间。错误,没有。如果你得到了超时,超时时间就过期了。如果你增加了超时时间,但超时没有发生,那么超时时间本来就太短了。我计算了两次操作的时间大约为0.5-1秒。我没有错4-8倍,之前连续两次叫它的问题消失了,所以有些奇怪,但现在它起作用了,我不在乎:)