我正在编写客户端 - 服务器应用程序,我的客户端是Android手机,我的服务器是我的笔记本电脑。
所以我的问题是这一行代码:
Socket connectionToServerSocket = new Socket(hostName, portNumber);
当我的手机通过我的家庭wifi连接连接到互联网时,工作得非常好,并且当通过3G(蜂窝提供商)连接时只是超时,例如它会阻塞一段时间然后抛出超时异常。
时髦的是,我可以看到(使用OS Monitor)某些应用程序通过非常常见的端口连接,例如端口#80,但是将portNumber(以及服务器正在侦听的端口)切换到80没有帮助(例如它仍然超时),我尝试了许多不同的端口 - 相同的结果。
DNS工作正常(例如,它将我赋予hostName的逻辑字符串转换为正确的IP),但它不会向服务器发送任何内容...... 我输了,可能是什么原因?我该如何检查并解决它?
答案 0 :(得分:0)
我遇到过这个问题以及做类似的应用程序。
您的笔记本电脑和手机可以在同一网络上相互连接,因为它们通过您的路由器共享IP地址查找。
当设备连接到WIFI时,它的请求通过路由器检查IP地址,它会发现你的笔记本电脑IP并将请求保存到DNS,因为它已经可以找到笔记本电脑的IP 。笔记本电脑的工作方式相同,它也通过路由器找到客户端的IP地址。
但是,当您的手机使用3G时,无法准确了解笔记本电脑的IP地址。这就是它超时的原因:它从您的路由器到最近的DNS(它尝试解析正确的IP地址),如果它找不到域或与之匹配的IP将失败。
解决此问题的一些步骤。 。
根据您的路由器,您可以为笔记本电脑的IP设置端口转发。这意味着您的路由器的传入请求可以通过管道传输到您的笔记本电脑的服务器实现。
然后在您的笔记本电脑上访问此类http://touch.whatsmyip.org/之类的任何网站,以获取您的笔记本电脑IP。保存此项以添加到客户端Socket设置。
要进行调试,直到您的笔记本电脑服务器可以进行DNS查找,请进入您的客户端代码并添加它。
Socket debugSocket = new Socket(" the.laptop.ip",80);
一些警告:
未来的变化:
答案 1 :(得分:0)
案例1 :当您的笔记本电脑和手机连接到wifi时它正在工作吗?
尝试一次
案例2 :
Socket connectionToServerSocket = new Socket(newIP, portNumber);
一旦你得到我想说的话就试试这个。
您正在获取超时异常,因为您的服务器是 无法从外部网络访问该服务。
希望这会有所帮助:)
答案 2 :(得分:0)
原因是笔记本电脑中的服务器默认关闭外部网络,你需要做的就是端口转发 *请注意:端口转发会使您的服务器面临网络安全风险,请确保您做出正确的调整以确保服务器安全。