2

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

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

Socket connectionToServerSocket = new Socket(hostName, portNumber);

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

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

DNS 工作正常(例如,它将我给 hostName 的逻辑字符串转换为正确的 IP),但它不会向服务器发送任何内容......我迷路了,可能是什么原因?我该如何检查和解决它?

4

3 回答 3

0

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

于 2016-05-02T07:06:10.740 回答
0

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

试试这个

案例2

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

试试这个,一旦你会明白我想说的话。

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

希望这会有所帮助:)

于 2016-05-02T06:59:08.043 回答
0

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

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

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

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

解决此问题的一些步骤。. .

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

  2. 然后在您的笔记本电脑上访问任何类似http://touch.whatsmyip.org/的网站以获取您的笔记本电脑 IP。保存它以添加到您的客户端套接字设置。

  3. 为了在您的笔记本电脑服务器对 DNS 查找可见之前进行调试,请进入您的客户端代码并添加它。

    Socket debugSocket = new Socket("the.laptop.ip", 80);

一些警告:

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

未来变化:

  • 一旦专用服务器启动并运行,注册到域,您可以将上述 ip 参数更改为“your.domain.com”,在幕后,您的服务器的实际 IP 地址将通过 DNS 查找找到。
于 2016-05-02T00:45:03.837 回答