当手机在3G时插座超时,当手机在Wifi时插座超时-为什么



我正在编程一个客户端-服务器应用程序,我的客户端是一部安卓手机,我的服务器是我的笔记本电脑。

所以我的问题是这一行代码:

Socket connectionToServerSocket = new Socket(hostName, portNumber);

当我的手机通过家庭wifi连接到互联网时,工作非常好,当通过3G(蜂窝网络提供商)连接时,它会超时,例如它会阻塞一段时间,然后抛出超时异常。

奇怪的是,我可以看到(使用OS Monitor)一些应用程序是通过非常常见的端口连接的,例如端口#80,但将portNumber(以及服务器正在监听的端口)切换到80没有帮助(例如,它仍然超时),我试过许多不同的端口,结果相同。

DNS运行良好(例如,它将我给hostName的逻辑字符串转换为正确的IP),但它不会向服务器发送任何信息。。。我迷路了,可能是什么原因?我如何检查和解决它?

我在做类似的应用程序时也遇到过这个问题。

您的笔记本电脑和手机可以在同一网络上相互连接,因为它们通过您的路由器共享IP地址查找。

当设备连接到WIFI时,它的请求通过路由器来检查IP地址,它会找到你的笔记本电脑IP并将请求保存到DNS,因为它已经可以找到笔记本电脑的IP了。笔记本电脑的工作方式相同,它也通过路由器找到客户端的Ip地址。

然而,当你的手机在3G上时,它无法准确知道你的笔记本电脑的IP地址在哪里。这就是它超时的原因:它从你的路由器转到最近的DNS(在那里它试图解析正确的IP地址),如果它找不到匹配的域或IP,它就会失败。

解决此问题的一些步骤。

  1. 根据您的路由器,您可以为笔记本电脑的IP设置端口转发。这意味着对路由器的传入请求可以通过管道传输到笔记本电脑的服务器实现。

  2. 然后去任何像这样的网站http://touch.whatsmyip.org/在您的笔记本电脑上获取笔记本电脑IP。保存此项以添加到您的客户端套接字设置中。

  3. 要进行调试,直到您的笔记本电脑服务器可用于DNS查找,请进入您的客户端代码并添加此代码。

    Socket debugSocket=新的Socket(".tlaptop.ip",80);

一些警告:

  • 根据您的路由器,您的ip可能会在重新启动时发生更改
  • 通过端口转发,使用您的ip的任何浏览器,例如178.12.434.01都可以登录到您的笔记本电脑个人服务器

未来变化:

  • 一旦专用服务器启动并运行,并在域中注册,您就可以将上述ip参数更改为"your.domain.com",在幕后,您的服务器的实际ip地址将通过DNS查找找到

原因是笔记本电脑中的服务器默认情况下与外部网络关闭,您需要做的是所谓的端口转发*请注意:端口转发会使您的服务器面临网络安全风险,请确保您做出了正确的调整以确保服务器的安全。

案例1:当你的笔记本电脑和手机连接到wifi时,它可以工作,对吗?

尝试一次

情况2

  1. 将手机连接到3G
  2. 启用手机热点
  3. 将笔记本电脑连接到手机的热点
  4. 检查您的笔记本电脑的IP,如果它被更改,请替换Socket对象中的IP。Socket connectionToServerSocket = new Socket(newIP, portNumber);
  5. 运行您的项目

只要试一下,你就会明白我想说的话。

您收到超时异常,因为您的服务器无法从外部网络访问该服务。

希望这将有所帮助:)

最新更新