Java套接字连接异常问题(连接超时)

标签 java android sockets

一些背景:

我有一个使用 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/

相关文章:

java - 使用 java 套接字的客户端-服务器应用程序中的 "Stream closed"IOException

Java 三元运算符语法

java - 无法使用 python requests 模块发送 `multipart/form-data` 请求

android - 如何在 MPAndroidChart 中添加 float x 和 float y 值

c - 如何解决阻塞套接字(用于 SSL 握手)的 Connect() 超时问题?

ios - 通过套接字连接在iOS上播放音频

java - 有没有办法将 SQL 查询转换为 liquibase 更改日志格式?

java - 如何进行定制的偏好选择

android - Iphone 源代码可用于开发相同的 android 应用程序吗?

java - 两个 Calendar 对象的小时差