【问题标题】:How to prevent application freeze if server unavailable?如果服务器不可用,如何防止应用程序冻结?
【发布时间】:2009-03-19 15:42:16
【问题描述】:
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);

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

【问题讨论】:

    标签: java sockets networking


    【解决方案1】:

    通过使用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
    }
    

    这仍然会阻塞 3 秒。如果您想防止这种情况发生,请使用线程进行连接。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这可能过于简单化(因为它不处理连接完成后如何“重新加入”线程 - 假设您需要这样做。)

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

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

        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();
        

        【讨论】:

          猜你喜欢
          • 2019-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-04
          • 1970-01-01
          • 2015-06-27
          • 1970-01-01
          相关资源
          最近更新 更多