Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未设置时接受超时异常";超时时间“;用于接受连接_Java - Fatal编程技术网

Java 未设置时接受超时异常";超时时间“;用于接受连接

Java 未设置时接受超时异常";超时时间“;用于接受连接,java,Java,我们正在使用TCP服务器。有时会出现以下异常 java.net.SocketTimeoutException: Accept timed out at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net.ServerSo

我们正在使用TCP服务器。有时会出现以下异常

java.net.SocketTimeoutException: Accept timed out
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
        at java.net.ServerSocket.implAccept(ServerSocket.java:530)
        at java.net.ServerSocket.accept(ServerSocket.java:498)
我在谷歌上搜索了一下,发现它是在超过timout时发生的,这是通过
setSoTimeout(timeinmilli)
方法设置的。但是,我们没有调用该方法

tcp服务器示例:

class TCPServer
    {   
        public static void main(String args[]){
            public void initializeConnectionHandler(String ip, int port) {
                try{            
                    ServerSocket serverSocket = new ServerSocket(port, serverSocket_backlog, InetAddress.getByName(ip));            
                    log("Waiting for client on port: " +serverSocket.getLocalPort());
                    while(true){
                        Socket socket = serverSocket.accept();
                        log("Just connected to "+ socket.getRemoteSocketAddress());
                        Runnable tcpConnectionHandler = new TCPConnectionHandler(serverSocket, socket, workerManager);
                        new Thread(tcpConnectionHandler).start();
                    }       
                }
                catch (Exception e){
                    log("Exception occured while initializing ConnectionHandlers: "+e);
                    logException(e);
                    System.exit(0);
                }
            }
        }
    }

您是对的,只有通过调用
setSoTimeout
设置超时时,才会发生此异常。尽管如此,如果你浏览搜索结果,你会发现偶尔会有关于这种影响的讨论,正如你所看到的,例如,在那里,他们认为他们在JVM中发现了一个bug,并添加了一个解决方法来保持服务器运行

报告此异常的另一个结果(德语,抱歉)指出,IPv6也处于活动状态时可能会出现问题。解决方案是将系统属性
java.net.preferIPv4Stack
设置为
true


我不喜欢后一种“解决方案”,但关于Tomcat团队实现的变通方法,我建议您也这样做。至少,如果出现这样的异常,不要停止整个循环。

如果您通过调用
setSoTimeout
设置了超时,则此异常应该只发生,这是正确的。尽管如此,如果你浏览搜索结果,你会发现偶尔会有关于这种影响的讨论,正如你所看到的,例如,在那里,他们认为他们在JVM中发现了一个bug,并添加了一个解决方法来保持服务器运行

报告此异常的另一个结果(德语,抱歉)指出,IPv6也处于活动状态时可能会出现问题。解决方案是将系统属性
java.net.preferIPv4Stack
设置为
true


我不喜欢后一种“解决方案”,但关于Tomcat团队实现的变通方法,我建议您也这样做。至少,如果出现这样的异常,不要停止整个循环。

它在内部调用
TwoStacksPlainSocketImpl
类的
socketAccept
方法

java.net.SocketTimeoutException: Accept timed out
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
        at java.net.ServerSocket.implAccept(ServerSocket.java:530)
        at java.net.ServerSocket.accept(ServerSocket.java:498)
方法是本机的,所以您无法完全找到原因,但下面是来自openjdk的本机代码


您可以在其中找到它正在抛出所提到的异常。

它在内部调用
TwoStacksPlainSocketImpl
类的
socketAccept
方法

java.net.SocketTimeoutException: Accept timed out
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
        at java.net.ServerSocket.implAccept(ServerSocket.java:530)
        at java.net.ServerSocket.accept(ServerSocket.java:498)
方法是本机的,所以您无法完全找到原因,但下面是来自openjdk的本机代码


您可以在其中找到它正在抛出所提到的异常。

只需增加套接字时间,然后重试it@Kick这是一个答案,但不是这个问题的答案;-)这是复制粘贴错误吗?因为
main
方法中的方法
initializeConnectionHandler
看起来不正确。只需增加套接字时间并重试it@Kick这是一个答案,但不是这个问题的答案;-)这是复制粘贴错误吗?因为
main
方法中的方法
initializeConnectionHandler
看起来不正确。