如果服务器不可用,如何防止应用冻结?

时间:2009-03-19 15:42:16

标签: java sockets networking

InetAddress serverAddr = InetAddress.getByName(serverAddress);
String hostname = serverAddr.getCanonicalHostName();
Socket socket = new Socket(serverAddr, portNumber);
// Freezes before this line if the server is unavailable
socket.setSoTimeout(3000);

有谁知道如何实施服务器可用性检查或防止冻结?

3 个答案:

答案 0 :(得分:6)

通过使用two-argument constructor,您可以告诉Java立即连接。您正在寻找的可能是

Socket socket = new Socket();
// Configure socket here
socket.connect(new InetSocketAddress(serverAddr, portNumber), 3000);
if (! socket.isConnected()) {
    // Error handling
} else {
    // Use socket
}

虽然这仍然会阻止3s。如果要防止这种情况,请使用线程进行连接。

答案 1 :(得分:3)

我将建议显而易见:使用单独的线程来执行此操作。线程可以冻结而不会冻结应用程序。

答案 2 :(得分:0)

这可能过于简单了(因为它没有涉及在连接完成后如何“重新加入”线程 - 假设你需要这样做。)

此外,如果这种情况经常发生,您希望使用Executor(线程池)而不是手动创建自己的Thread - 线程创建/销毁是昂贵的。

我也忽略了这个片段中的异常处理(这不是完全无关紧要的。)

Runnable runnable = new Runnable() {
   public void run() {
      InetAddress serverAddr = InetAddress.getByName(serverAddress);
      String hostname = serverAddr.getCanonicalHostName();
      Socket socket = new Socket(new InetSocketAddress(serverAddr, portNumber), 3000);
      /* ... do more of your after-connection processing here, assuming it doesn't
       * need to be in the original "dispatch" thread.
       */
   }
};

Thread t = new Thread(runnable);
t.start();