Java 未设置时接受超时异常";超时时间“;用于接受连接
我们正在使用TCP服务器。有时会出现以下异常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
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
看起来不正确。