Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 手机在3G上时插座超时,在Wifi上时插座超时-为什么?_Java_Android_Sockets_3g_4g - Fatal编程技术网

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。保存此文件以添加到客户端套接字设置中

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

    Socket debugSocket=新的套接字(“the.laptop.ip”,80)

  • 一些警告:

    • 根据您的路由器,您的ip可能在重新启动期间发生变化
    • 通过端口转发,任何带有ip的浏览器(例如)178.12.434.01都可以登录到笔记本电脑的个人服务器
    未来的变化:

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

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

    试试这个

    案例2

  • 将手机连接到3G
  • 在手机上启用热点
  • 将笔记本电脑连接到手机的热点
  • 检查笔记本电脑的IP(如果已更改)替换Socket对象中的IP<代码>套接字连接服务器套接字=新套接字(newIP,端口号)
  • 运行您的项目
  • 只要试一下,你就会明白我想说的

    您正在获取超时异常,因为您的服务器 无法从外部网络访问该服务


    希望这会有所帮助:)

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

    “他们通过您的路由器共享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匹配: