当前位置: 首页 > 知识库问答 >
问题:

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

锺超英
2023-03-14

一些背景:

我有一个使用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连接进行连接。(事实上它很少起作用)

我还尝试手动绑定本地wifi IP地址和一些随机端口。然后进行套接字连接。但这也不起作用。

我最初认为,如果我使用一次,端口号不会正确关闭。但后来我注意到,即使我第一次打开应用程序,也经常出现这个问题。我甚至尝试将端口设置为0(临时端口),以确保它可以接收任何可用的端口。

任何建议。如果有更好的方法来解决这个问题,请告诉我。

先谢谢你。

共有1个答案

安承教
2023-03-14

确保运行智能手机和电脑连接到同一个互联网连接!(即:智能手机可能正在使用4G网络或自己的网络,而电脑可以使用wifi)

 类似资料:
  • 代码片段如下所示: 如果有人有决议,请帮忙?

  • 在套接字最终接受另一端消失的情况下,什么指定了这个超时?是操作系统(Ubuntu 11.04),还是来自TCP/IP规范,还是套接字配置选项?

  • 我正在尝试使用Telegram Java API https://github.com/ardock/Telegram-API,我从一些简单的RPC调用开始: 连接失败后,它一次又一次尝试连接,但不是很成功。我不知道是什么原因和如何解决这个问题。也许有人也有同样的问题?我将非常感激你的帮助)

  • 我能够使用DataGrip附带的JDBC驱动程序(我使用的是Mac)并看到以下错误消息,它以前工作得非常好,我没有打扰任何事情:

  • 服务器名设置为“localhost”,端口为80。使用这些参数,我可以运行程序而没有任何异常,但是当代码到达in.readutf()行时,它会旋转。 当端口更改为任何其他端口时,我会得到一个连接拒绝异常。 另一方面,当我创建一个简单的“ServerSocket”程序接收端口80上的请求时,我会得到“Address Academy in use”异常,除了80之外的任何端口都适用于“ServerSo