具有错误IP的Android套接字连接会导致冻结

时间:2014-01-09 10:29:41

标签: java android sockets

我正在尝试创建一个连接到服务器的套接字。用户可以手动输入套接字的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然后永久挂起。

2 个答案:

答案 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秒 - 根据系统时钟运行计数器,时间到时,如果没有连接 - 抛出异常并取消连接。