【问题标题】:Android socket connection issuesAndroid套接字连接问题
【发布时间】:2016-04-22 13:41:31
【问题描述】:

我正在创建一个作为服务运行的聊天应用程序。我使用套接字连接到聊天服务器,并使用setSoTimeout 声明超时。

当连接空闲时(例如,当我在家并连接到 WiFi 时)我永远不会遇到问题。当我外出时,我的 WiFi 连接丢失,我的手机切换到 3G。问题是套接字保持连接而不接收任何数据。 (所以不会调用超时异常。)

我还尝试在我的 AndroidManifest.xml 中添加一个CONNECTIVITY_CHANGE 广播检测器,这也不起作用。

在下面查看我的套接字连接:

    socket = new Socket(proxy);
    SocketAddress socketAddress = new InetSocketAddress(HOST,
                PORT);
    socket.connect(socketAddress);
    if (socket.isConnected()) {
        socket.setSoTimeout(1020000); //Even when setting to 10000 makes no sense
        return true;
    } else {
        Log.w("WARNING", "Failed to connect to the server");
        return false;
    }

在后台还运行了一些循环来检查服务器的聊天消息,当没有收到数据时,这些循环会触发重新连接,但这也不起作用。 (在重新连接期间,我将套接字设置为socket.close()socket = null,然后再次连接。)

那么有什么想法,也许我需要使用不同的套接字?或者其他一些代码来解决这个问题?谢谢。

【问题讨论】:

  • Socket.isConnected() 在你测试它的时候不可能是假的。

标签: java android


【解决方案1】:

在这种意外的(从应用程序的角度来看)网络断开连接时,套接字不会知道它已断开连接。如果出现这种情况,唯一的办法就是尝试向套接字写入一些数据。当套接字断开连接时,写入数据会抛出 IOExcpetion 并带有类似Connection reset 的消息。

您最好实现一个心跳方法来检测断开连接。每 5~10 秒发送一个数据包到服务器就可以足够快地检测到网络断开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多