【问题标题】:Why does this use of Socket.setSoTimeout() not work?为什么 Socket.setSoTimeout() 的这种使用不起作用?
【发布时间】:2016-03-16 10:14:45
【问题描述】:

这段代码 sn-p 来自我在 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 套接字有什么误解,或者它只是受到了可怕的支持?

【问题讨论】:

  • 你知道 Connection Timeout 和 setSoTimeout 不同吗? setSoTimeout 将在给定的毫秒内阻塞 read() 调用。如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。
  • 谢谢,我现在也为套接字创建设置了连接超时。

标签: java android sockets tcp tcpclient


【解决方案1】:

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

【讨论】:

  • 奇怪地增加了超时工作。我说很奇怪,因为无论是否超时,操作都需要不到一秒的时间。
  • 错误,没有。如果您收到超时,则超时期限已过。如果你增加了超时并且超时没有发生,那么超时本来就太短了。
  • 我计算了两次操作大约需要 0.5-1 秒。我没有错 4-8 倍,之前连续调用两次的问题消失了,所以有些奇怪,但现在它可以工作了,我不在乎 :)
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多