繁体   English   中英

套接字无法通过移动互联网连接到服务器,因为我使用主机名而不是IP,但可以在Eclipse和WIFI中使用

[英]Socket cannot connect to server via mobile internet because I use hostname instead of IP but works in i.e. Eclipse and via WIFI

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

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"/>

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

IE浏览器

proxy.11.xxx.net:54812

到网络浏览器并输入,服务器已连接。 当然,当我通过WIFI进入本地网络并输入RPi的IP地址时,它确实有效,但这不是我的意思。 我希望能够从Android通过Internet连接。 为什么我可以从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) 

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

为了通过Internet访问RPi,您需要一个公共 Internet IP地址,该地址可以将流量路由到RPi。 而且,如果您希望客户端使用静态主机名而不是直接使用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地址的静态主机名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM