【问题标题】:Opening a socket only works when 3G/4G is disabled?只有在禁用 3G/4G 时才能打开套接字?
【发布时间】:2016-12-12 09:23:31
【问题描述】:

我想对我的 Android 应用执行以下操作:

  • 我有一个连接的对象,它发出一个 Wi-fi 网络(软 AP),所以我的应用可以与之通信
  • 连接到网络上的本地设备 192.168.0.1 正在发射 Wi-fi
  • 我想打开一个套接字与这个设备通信

                socket = new Socket();
                socket.setSoTimeout(10000);
                socket.connect(new InetSocketAddress("192.168.0.1", 80), 5000);
    

此代码适用于我的大多数测试设备,除了 Nexus 6 (Android 7) 我有以下情况

无法正常工作的情况

  • 手机连接到 Wifi 并连接到 3G/4G

-> Socket 打不开!

有效的案例

  • 手机连接到 Wifi 但未连接到 3G/4F

--> 套接字打开成功!

我能以编程方式做些什么来让它在所有情况下都能正常工作?

【问题讨论】:

  • 您遇到了什么错误或异常?
  • 套接字超时异常
  • 我设置了警报关闭 3g/4g 并打开 wi-fi,我不能做得更好。

标签: android sockets networking android-wifi


【解决方案1】:

我终于找到了解决办法

final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
        cm.unregisterNetworkCallback(this);
        network.bindSocket(socket);
        socket.setSoTimeout(SOCKET_TIMEOUT);
        socket.connect(new InetSocketAddress(ip, port), CONNECTION_TIMEOUT);
    }
}
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2013-10-25
    • 2017-06-14
    • 2013-09-16
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多