一些背景:
我有一个使用 3G 或 4G 数据连接的 Android 应用。但它也连接到 WiFi 热点,以便在热点设备和应用程序之间传输一些数据。
我想要做的:创建一个到这个 wifi 热点的套接字连接,并通过这个套接字发送/接收数据。
我添加了以下代码以确保我们在创建套接字时使用 wifi 热点 wifi(否则有时最终会使用数据连接):
android.net.wifi.WifiManager wm = (android.net.wifi.WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
这似乎没问题。但是,我在尝试连接到远程服务器地址时遇到问题。这是我正在使用的代码:
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
InetAddress localAddress = InetAddress.getByName(ip);
socket = new Socket(serverAddr,SERVERPORT,localAddress,0);
我正在使用从本地地址连接到远程服务器地址的套接字调用(如上面获取的wifi连接wifi地址)。我将本地端口设置为 0,因为这将允许套接字选择任何本地可用端口。但是,当我这样做时,我总是收到连接超时错误。
java.net.ConnectException: failed to connect to /A.B.C.D (port 3003) from /A.B.C.E (port 48492): connect failed: ETIMEDOUT (Connection timed out)
我确信服务器套接字代码没有问题,因为如果我不使用本地地址,我就能够连接到服务器。下面的代码始终有效:
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
但是,我不能总是使用它,因为我希望数据和 wifi 同时打开,并且上面的代码并不能保证它将始终使用 wifi 连接进行连接。 (事实上它很少起作用)
我还尝试手动绑定(bind)到本地 wifi IP 地址和一些随机端口。然后进行套接字连接。但这也不起作用。
我最初以为端口号如果使用一次就无法正确关闭。但后来我注意到,即使我第一次打开该应用程序,这个问题也经常出现。我什至尝试将端口设置为 0(临时端口)以确保它获取任何可用端口。
任何建议。如果有更好的方法来解决这个问题,请告诉我。
提前致谢。
最佳答案
确保运行时智能手机和计算机连接到同一互联网连接! (即:智能手机可能使用 4G 或自己的网络,而计算机可以使用 wifi)
关于Java套接字连接异常问题(连接超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472767/