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);
有谁知道如何实施服务器可用性检查或防止冻结?
答案 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();