Java 手机在3G上时插座超时,在Wifi上时插座超时-为什么?
我正在编写一个客户端-服务器应用程序,我的客户端是安卓手机,服务器是笔记本电脑 所以我的问题是这一行代码:Java 手机在3G上时插座超时,在Wifi上时插座超时-为什么?,java,android,sockets,3g,4g,Java,Android,Sockets,3g,4g,我正在编写一个客户端-服务器应用程序,我的客户端是安卓手机,服务器是笔记本电脑 所以我的问题是这一行代码: Socket connectionToServerSocket = new Socket(hostName, portNumber); 当我的手机通过我的家庭wifi连接连接到互联网时,效果非常好,当通过3G(手机提供商)连接时,它会超时,例如它会阻塞一段时间,然后抛出超时异常 有趣的是,我可以看到(使用OS Monitor)有些应用程序是通过非常常见的端口连接的,例如端口80,但是将端
Socket connectionToServerSocket = new Socket(hostName, portNumber);
当我的手机通过我的家庭wifi连接连接到互联网时,效果非常好,当通过3G(手机提供商)连接时,它会超时,例如它会阻塞一段时间,然后抛出超时异常
有趣的是,我可以看到(使用OS Monitor)有些应用程序是通过非常常见的端口连接的,例如端口80,但是将端口号(以及服务器正在侦听的端口)切换到80没有帮助(例如,它仍然超时),我尝试了许多不同的端口,得到了相同的结果
DNS工作正常(例如,它将我提供的主机名的逻辑字符串转换为正确的IP),但它不向服务器发送任何信息。。。
我迷路了,原因是什么?如何检查并解决此问题?我在执行类似的应用程序时也遇到了此问题
您的笔记本电脑和手机可以在同一网络上相互连接,因为它们通过路由器共享IP地址查找 当设备连接到WIFI时,它的请求通过路由器来检查IP地址,它将找到您的笔记本电脑IP并将请求保存到DNS,因为它已经可以找到笔记本电脑IP。笔记本电脑的工作方式也一样,它也通过路由器找到客户端的Ip地址 然而,当你的手机在3G上时,它无法确切知道你的笔记本电脑的IP地址在哪里。这就是它超时的原因:它从您的路由器转到最近的DNS(在那里它尝试解析正确的IP地址),如果它找不到匹配的域或IP,它将失败 修复此问题的一些步骤
- 根据您的路由器,您的ip可能在重新启动期间发生变化
- 通过端口转发,任何带有ip的浏览器(例如)178.12.434.01都可以登录到笔记本电脑的个人服务器
- 一旦专用服务器启动并运行,在域中注册后,您可以将上述ip参数更改为“your.domain.com”,并在后台通过DNS查找找到服务器的实际ip地址
希望这会有所帮助:)原因是,默认情况下,笔记本电脑中的服务器与外部网络关闭,您需要做的是端口转发
*注意:端口转发会使您的服务器面临网络安全风险,请确保您进行了正确的调整以确保服务器的安全。“他们通过您的路由器共享IP地址查找。”我不知道这意味着什么,但问题很简单,当你的手机使用你的手机连接和你的wifi时,它处于一个完全不同的网络上。有了wifi,它就在你的局域网上。对于3G,它位于您的移动服务提供商的网络上,可能无法直接接收传入连接。我添加了一些说明,我希望它更有意义(Xaxon:)您的说明可能会引起更多的混乱。。当连接到LAN上的IP地址时,路由器会看到目标IP地址位于路由器知道在本地路由的范围内。我甚至不知道“将请求保存到DNS”是什么意思。连接时没有任何内容会导致DNS条目发生更改。“它通过路由器找到客户机的Ip地址”也是奇怪的。我的意思是,所有的东西都通过路由器,我想。。。但是路由器不一定与查找IP地址有任何关系。您的答案中还有许多其他错误。此外,在端口转发说明中,“Socket debugSocket=new Socket”(.laptop.ip),80);”是错误的。您需要使用路由器的外部IP地址。笔记本电脑的IP地址将在RFC1918不可扩展的范围内。“取决于您的路由器,您的ip可能会在重新启动期间发生变化”-您的外部ip地址由您的ISP决定,而不是由您的路由器决定。@jankigadhiya我不确定您指的是哪个部分,但我非常确定我指出的一切都是正确的。我不确定谁应该“试着理解一次”。你的笔记本电脑的IP是公共的(例如,可以从你的网络外部访问)?看起来您已为其分配了一个无法从手机3G网络访问的专用IP。检查此处显示的IP是否与您用作套接字主机IP的IP匹配: