【问题标题】:Socket cannot connect to server via mobile internet because I use hostname instead of IP but works in i.e. Eclipse and via WIFI套接字无法通过移动互联网连接到服务器,因为我使用主机名而不是 IP,但可以在 Eclipse 和通过 WIFI 中工作
【发布时间】:2016-06-10 18:23:28
【问题描述】:

我在通过移动互联网连接 Android 手机和 Raspberry Pi 上的服务器时遇到问题。我在 RPi 上创建了简单的服务器,在 android 上创建了客户端。我还为 DNS 问题安装了 Weaved 软件。当我在另一台 PC 中使用简单客户端时,即 Eclipse,我可以使用即连接到服务器:

client = new Socket("proxy.11.xxx.net", 54812)

当我使用 WIFI 时,在 android 上也是如此。当我关闭 WIFI 时,问题就开始了。套接字不连接到服务器。我设置了权限:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

没有任何例外。套接字创建成功但未连接到服务器。

I.E 我放了

proxy.11.xxx.net:54812

到网络浏览器并输入,与服务器建立连接。 当然,当我通过 WIFI 在本地网络中并输入 RPi 的直接 IP 号时它可以工作,但这不是我的意思。我希望能够通过互联网从 android 连接。为什么我可以在PC上连接相同的地址而不能在android上连接?

任何人都可以提供帮助/提供建议吗?

编辑:

当我使用:new Socket (proxy.11.xxx.net,54812) 时,没有异常。套接字创建成功:http://imgur.com/pTHXaAE

当我使用new Socket(http://proxy.11.xxx.net,54812):

java.net.UnknownHostException: Unable to resolve host "http://proxy11.yoics.net": No address associated with hostname
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:457)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.InetAddress.getAllByName(InetAddress.java:215)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.Socket.tryAllAddresses(Socket.java:109)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.Socket.<init>(Socket.java:178)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.Socket.<init>(Socket.java:150)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at com.mmc.mateusz.rpilight.Client.openSocket(Client.java:50)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at com.mmc.mateusz.rpilight.Client.doInBackground(Client.java:76)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at com.mmc.mateusz.rpilight.Client.doInBackground(Client.java:30)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-10 22:03:46.576 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.lang.Thread.run(Thread.java:818)
06-10 22:03:46.577 29922-29944/com.mmc.mateusz.rpilight W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
06-10 22:03:46.577 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at libcore.io.Posix.android_getaddrinfo(Native Method)
06-10 22:03:46.577 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
06-10 22:03:46.577 29922-29944/com.mmc.mateusz.rpilight W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:438) 

【问题讨论】:

  • socket无法连接时实际报错是什么?
  • 这听起来像是网络问题,而不是编程问题。请尝试在ServerFault 上提问。

标签: java android sockets mobile hostname


【解决方案1】:

这显然是网络问题,而不是编码问题。

为了通过 Internet 访问 RPi,您需要一个可以将流量路由到 RPi 的公共 Internet IP 地址。如果您希望客户端使用静态主机名而不是直接使用 IP 进行连接,则需要将所需主机名映射到当前 IP 地址的 DNS 注册(在本例中,由 weaved.com 提供)。

对于 IP 地址本身,RPi 需要:

  1. 它自己的直接连接到 Internet,因此它有一个由您的 ISP 分配的公共 IP 地址。

  2. 连接到具有公共 Internet IP 地址的 LAN。 LAN 路由器必须配置端口转发以将外部流量转发到 RPi。客户端将连接到直接连接到 Internet 的路由器,然后路由器会将连接转发到 RPi。

无论哪种方式,您的 ISP 也不得阻止入站客户端连接。一些 ISP 阻止客户托管自己的服务器,或者他们对该功能收取额外费用。请咨询您的 ISP。

当您的客户端应用程序和 RPi 位于 LAN 的同一侧时,这些问题不是一个因素,例如当两者都通过 WiFi 连接到同一个路由器时。

因此,简而言之,请确保您有一个公共 IP 地址,该地址提供了在 RPi 和外部 Internet 客户端之间交换数据包的可行路由,并确保您有一个可以解析为该 IP 地址的静态主机名。

【讨论】:

  • 我在 weaved.com 中有“通用 TCP”。我可以使用用 Eclipse 编写的客户端通过 PC 上的 proxy11.yoics.net 名称主机进行连接。我在android中做同样的事情,但有一个问题。为什么在 Java 中的 PC 上运行正常,但相同的代码(几乎,但这部分是相同的)却不行?
  • 客户端是在 PC 还是 Android 设备上运行都没有关系。重要的是网络设置。如果您的 PC 可以连接,但 Android 设备不能,那么您的 PC 必须采用不同的网络路由才能访问 RPi,而不是公共 Internet。我刚刚尝试从我的机​​器连接到proxy11.yoics.net:54812,但它无法连接(不过我可以ping IP)。因此,您显然没有正确配置网络路由以允许客户端通过公共 Internet 连接到您的 RPi。这意味着这个问题应该在 ServerFault 而不是 StackOverflow 上。
  • 那么除了端口转发之外,没有其他选项可以通过移动互联网从 android 连接到 RPi 吗?那么为什么在weed中会有这个服务呢。 com?
  • hehehe 这个主机名是想象你无法连接到这个,因为我更改了主机名。但如果你愿意,我可以写真正的主机名
  • 这不是 Android 问题,而是网络问题。如果您的 RPi 在路由器后面运行,您需要在路由器上启用端口转发,以便 ANY 外部客户端可以连接到指定的 IP/端口并转发到您的 RPi 的 IP/端口。 weaved.com 只是为客户端提供了一种将您的主机名解析为您的公共 IP 地址的方法,仅此而已。如果 IP 属于路由器,则需要向 RPi 提供进一步的路由(即端口转发)。这与weaved.com 无关。哦,是的,还要确保没有防火墙阻止入站连接。
猜你喜欢
  • 2017-03-08
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多