Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android套接字连接错误导致冻结_Java_Android_Sockets - Fatal编程技术网

Java Android套接字连接错误导致冻结

Java Android套接字连接错误导致冻结,java,android,sockets,Java,Android,Sockets,我正在尝试创建一个连接到服务器的套接字。用户可以手动输入套接字的IP地址和IP端口 当地址和端口有效时,不会出现任何问题,但如果地址和端口无效,则会导致我的整个应用程序冻结 代码如下: public void connect() { try { String txHostIP = settings.getString("txHostIP", ""); int txHostport = Integer.parseInt(settings.getString(

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

将连接超时设置为5秒-根据系统时钟运行计数器,当时间到了,如果没有连接,则抛出异常并取消连接。

如果要让套接字在一定时间后中止,则必须执行以下操作:

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。

您是否尝试捕获
未知后异常
?尝试将
IOException
更改为
异常
。已经执行了该操作。仍然没有抛出异常:(可以运行getSoTimeout()吗)并告诉我们输出?@Xarus在初始化套接字之前还是之后。问题是程序在初始化套接字之后不会运行。您可能需要在异步任务中进行设置,以确保它与连接并行运行-正如您所述,使用当前代码不会调用超时指令。