【问题标题】:Android socket connection with wrong IP causes freeze错误IP的Android套接字连接导致冻结
【发布时间】:2014-01-09 10:29:40
【问题描述】:

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

【问题讨论】:

  • 你试过抓UnknownHostException吗?
  • 尝试将IOException 更改为Exception
  • Piotr 已经这样做了。仍然没有抛出异常:(
  • 你能运行 getSoTimeout() 并告诉我们输出吗?
  • @Xarus 在初始化套接字之前或之后。问题是初始化套接字后程序不会运行

标签: java android sockets


【解决方案1】:

如果你想让套接字在一段时间后中止,你必须这样做:

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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您可能需要在异步任务中进行设置,以确保它与连接并行运行 - 正如您所说,使用当前代码不会调用超时指令。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 2022-08-05
    • 2013-06-29
    • 2016-03-04
    • 2017-07-15
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多