2014-10-30 20 views
0

我试图实现接受连接但超时的服务器,并且只关闭了该特定连接如果它在N毫秒后没有收到来自该连接的任何内容。ServerSocket超时并退出服务器程序

从我对ServerSocketsetSoTimeout(int milliseconds)方法可能存在的误解中,我认为这种行为可以通过将N传递给setSoTimeout来完成。

我遇到的情况是一旦客户端建立连接,并且在N秒内不发送任何通过该连接的任何内容,服务器将捕获一个SocketTimeoutException,但会完全停止执行并结束运行服务器程序的进程。这里是我的服务器的listen方法:

private static void listen() throws IOException { 
    while(true) { 
     try { 
      Socket clientSocket = serverSocket.accept(); 
      Connection connexion = new Connection(clientSocket); 
      connexion.start(); 
     } catch (SocketTimeoutException e) { 
      System.out.println("Socket timed out!"); 
      break; 
     }   
    } 
} 

我成功地捕捉SocketTimeoutException,忽略它,认为导致异常的客户端连接被关闭(坏我知道了!)。然后我跳出catch块继续接受其他客户端连接。我在这里错过了什么?

回答

0

您需要在try-catch子句中添加continue;而不是break;。服务器将继续收听。

0

假定导致异常的客户端连接被关闭。

不正确的假设。 accept()已超时。客户端连接还没有做任何事情。

然后我只是跳出catch块继续接受其他客户端连接。

错误,不,你打出catch block到stop接受其他客户端连接。你正在接受循环。

我在这里错过了什么?

A continue而不是break

如果您不在乎SocketTimeoutException为什么在ServerSocket上设置套接字超时?只要删除它。

+0

有没有一种方法可以在客户端套接字上设置超时呢?是否有'Socket'类的方法可以实现我想要的功能? – cbrad 2014-10-30 07:59:33

+0

是的,错误,'setSoTimeout()',你在'ServerSocket'上调用的那个。你甚至看过? – EJP 2014-10-30 20:34:38

+0

我的不好,我一定错过了看到'''''setSoTimeout'方法;我认为它只适用于'ServerSocket'。再次感谢您提供丰富的答案@EJP – cbrad 2014-10-30 20:55:41