SocketTimeoutException

时间:2017-11-09 07:50:28

标签: java android

在我的应用程序中,我使用套接字与另一台设备进行通信。我的所有时间都有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) {

4 个答案:

答案 0 :(得分:1)

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

socket.timeout(12000);

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

clientBuilder.connectTimeout(60, TimeUnit.SECONDS);

或者您使用的任何套接字库都有手动提供超时的方法,因此只需键入您创建套接字的插槽名称并放置'。'之后,您可以获得搜索超时的可用方法的建议并使用该方法。

以下是库演示的链接用法:

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

答案 1 :(得分:0)

我遇到了同样的问题,但我通过使用这些方法解决了这个问题

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我会告诉您已粘贴的代码。

我发现你在第117行和第125行设置时间为3000毫秒,你需要将其最多更改为15秒

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

希望得到帮助

快乐编码。!