java - Android 套接字连接问题

标签 java android

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

当连接空闲时(例如当我在家并连接到 WiFi 时),我永远不会遇到问题。当我外出时,WiFi 连接丢失,我的手机会切换到 3G。问题是套接字保持连接状态而不接收任何数据。 (因此不会调用超时异常。)<有时会在 30 分钟后连接,但这需要减少到至少几秒。

我还尝试在 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。)

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

最佳答案

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

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

关于java - Android 套接字连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34836879/

相关文章:

java - 在不同大小的 JPanel 之间切换

android - 更新gradle到java 8时,总是在更改android测试代码后重建项目

android - bool 标志始终为假

Java exec方法不执行程序

java - 方法抛出 'org.hibernate.LazyInitializationException' 异常

Java SSL 套接字消息传输,对象还是字节[]?

java - 使用 Java 创建注册和登录页面

android - NDK 主文件夹中的目录与 NDK 版本有何关系?

android 应用程序速度/帧率?

java - 如何为谷歌地图创建自定义信息窗口?