【问题标题】:SocketTimeoutException [closed]SocketTimeoutException [关闭]
【发布时间】:2017-11-09 07:50:28
【问题描述】:

在我的应用程序中,我使用套接字与另一个设备进行通信。我一直有一个 SocketTimeoutException 。我在服务中所做的这种沟通

这是一个日志:

11-09 08:44:05.029 5458-6647/pl.teminalmobile W/System.err: java.net.SocketTimeoutException: Read timed out
11-09 08:44:05.030 5458-6647/pl.teminalmobile W/System.err:     at java.net.SocketInputStream.socketRead0(Native Method)
11-09 08:44:05.031 5458-6647/pl.teminalmobile W/System.err:     at java.net.SocketInputStream.read(SocketInputStream.java:151)
11-09 08:44:05.031 5458-6647/pl.teminalmobile W/System.err:     at java.net.SocketInputStream.read(SocketInputStream.java:120)
11-09 08:44:05.031 5458-6647/pl.teminalmobile W/System.err:     at java.net.SocketInputStream.read(SocketInputStream.java:106)
11-09 08:44:05.032 5458-6647/pl.teminalmobile W/System.err:     at pl.teminalmobile.Service.Service22.start1(Service22.java:256)
11-09 08:44:05.032 5458-6647/pl.teminalmobile W/System.err:     at pl.teminalmobile.Service.Service22.access$000(Service22.java:75)
11-09 08:44:05.032 5458-6647/pl.teminalmobile W/System.err:     at pl.teminalmobile.Service.Service22$19.run(Service22.java:963)
11-09 08:44:05.033 5458-6647/pl.teminalmobile W/System.err:     at java.util.TimerThread.mainLoop(Timer.java:555)
11-09 08:44:05.033 5458-6647/pl.teminalmobile W/System.err:     at java.util.TimerThread.run(Timer.java:505)

这一行引起了 SocketTimeOutException :

  while ((bytesRead = inputStream.read(content)) != -1) {

【问题讨论】:

  • 为什么不提行号?
  • Service22.java:256) 11-09 08:44:05.032 5458-6647/pl.teminalmobile W/System.err: at pl.teminalmobile.Service.Service22.access$000(Service22.java:75) 11-09 08:44:05.032 5458-6647/pl.teminalmobile W/System.err: at pl.teminalmobile.Service.Service22$19.run(Service22.java:963)。那些线上是什么?他们导致超时不是吗?

标签: java android


【解决方案1】:

您的套接字超时意味着从其他设备获得响应需要很长时间,并且您的请求在获得响应之前过期。要解决此问题,您需要手动设置套接字超时,例如搜索如何提供库的套接字超时正在使用。如果使用 socket.io 则需要添加

socket.timeout(12000);

这里 12000 是毫秒,或者如果您使用的是 OkHttp 客户端,那么您可以添加:

clientBuilder.connectTimeout(60, TimeUnit.SECONDS);

或者您使用的任何套接字库都有手动超时的方法,因此只需输入您创建套接字的套接字名称并放置“。”之后,您会在搜索超时并使用该方法时对可用方法提出建议。

这里是库演示的链接使用:

https://github.com/socketio/socket.io-client-java

【讨论】:

  • 如果它对你有用,别忘了把这篇文章标记为 answer.Happy coding :)
  • 我不使用 OkHttp 客户端发送和获取数据我使用流,这是个好主意吗?我设置了一个超时 requestSocket.setSoTimeout(7000);但它不能正确工作
  • socket 我建议你使用socket.io库,我在几个项目中使用过,非常好用。您不必面对使用 socket.io 精心设计和优化的方式来使用套接字的问题。所以兄弟,如果你很容易切换到 socket.io,那就去吧。
  • 你能告诉我你推荐给我的插座吗?我必须使用哪些 gradle 依赖项
  • @KrzysztofPokrywka Bro 我更新了我的答案并提供了一个链接,请点击该链接,说明也在那里你会很好地使用它。我在许多项目中使用它,它就像一个魅力。对于进一步的帮助发短信给我。如果对您有帮助,请不要忘记将帖子标记为答案。快乐编码:)
【解决方案2】:

我有同样的问题,但我用这些方法解决了它

将字符编码设置为 UTF-8 和字符集

【讨论】:

    【解决方案3】:

    虽然我不完全确定,但我认为您没有正确使用Socket.setSoTimeout()。 您只应该对 Socket requestSocket 使用一次。在使用 Socket 的内容之前尝试在代码的开头使用它,或者通过将代码传递给函数而不是三次调用函数来使代码模块化。从我的个人经验来看,这使得使用Socket.setSoTimeout() 变得更加容易。

    【讨论】:

      【解决方案4】:

      我给你看你粘贴的代码。

      我发现您在第 117 行和第 125 行设置了 3000 毫秒的超时时间,您需要将其最大更改为 15 秒

      requestSocket.connect(new InetSocketAddress(a, 6666), 3000);
      

      希望对你有所帮助

      编码愉快!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 2013-01-16
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多