SocketTimeoutException

SocketTimeoutException

Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。
                        
                    
                
            
        
            
        
                
                    
                
            
                
                    想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                
                    2年前关闭。
            
        

    

在我的应用程序中,我使用套接字与另一个设备通信。一直以来,我都有一个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) {

最佳答案

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

socket.timeout(12000);


这里是12000毫秒,如果您使用的是OkHttp Client,则可以添加:

clientBuilder.connectTimeout(60, TimeUnit.SECONDS);


或无论您使用哪个套接字库,都有一种方法可以手动给出超时,因此只需键入用于创建套接字的套接字名称,然后放置“。”即可。之后,您会在搜索超时的过程中对可用方法提出建议,并使用该方法。

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

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

10-08 13:20