我正在尝试创建一个连接到服务器的套接字。用户可以手动输入套接字的IP地址和IP端口。
当地址和端口有效时没有任何问题,但是当它们没有时,它会导致整个应用程序冻结。
这是代码:
public void connect() {
try {
String txHostIP = settings.getString("txHostIP", "");
int txHostport = Integer.parseInt(settings.getString("txHostPort", ""));
//Where it all goes wrong. The program just hangs here for eternity
socket = new Socket(txHostIP, txHostport);
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch (IOException e) {
showMessage(context, "Something went wrong");
}
}
我想要的是当没有连接时弹出消息但是如果IP端口或地址不正确,程序不会抛出异常。
我该如何解决这个问题?非常感谢任何帮助!
修改
我添加了一些System.out打印件来显示程序是如何挂起的。我还添加了一个5秒的套接字连接超时。程序仍然无法访问该代码块。
public void connect() {
try {
String txHostIP = settings.getString("txHostIP", "");
int txHostport = Integer.parseInt(settings.getString("txHostPort", ""));
System.out.println("1");
socket = new Socket(txHostIP, txHostport);
System.out.println("2");
socket.connect(socket.getLocalSocketAddress(), 5000);
System.out.println("3");
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("4");
} catch (IOException e) {
showMessage(context, "Something went wrong");
}
}
它只打印1然后永久挂起。
答案 0 :(得分:2)
如果你想在一段时间后让套接字中止,你必须这样做:
int timeout = 5000;
int port = 1234;
String address = "localhost";
InetSocketAddress inetAddress = new InetSocketAddress(address, port);
Socket socket = new Socket();
socket.connect(inetAddress, timeout);
另外,在设置soTimeout之前,套接字将挂起。如果无法访问远程主机,connect方法将抛出SocketTimeoutException。
答案 1 :(得分:1)
设置连接超时,比如5秒 - 根据系统时钟运行计数器,时间到时,如果没有连接 - 抛出异常并取消连接。