一些背景:
我有一个使用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(临时端口),以确保它可以接收任何可用的端口。
任何建议。如果有更好的方法来解决这个问题,请告诉我。
先谢谢你。
确保运行智能手机和电脑连接到同一个互联网连接!(即:智能手机可能正在使用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