2016-06-10 26 views
0

我通過移動互聯網與Raspberry Pi上的Android手機和服務器之間的連接有問題。我在RPi和Client上創建了簡單的服務器。我還將Weaved軟件安裝到DNS問題上。當我在Eclipse中即另一臺PC使用簡單的客戶端,我可以連接到服務器使用即:套接字無法通過移動互聯網連接到服務器,因爲我使用主機名而不是IP,但在Eclipse中和通過WIFI工作

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

同樣是在Android上,當我使用WIFI。問題在我關閉WIFI時開始。套接字dosn't連接到服務器。我設置了權限:

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

沒有任何例外。套接字創建成功但不連接到服務器。

我把

proxy.11.xxx.net:54812 

到Web瀏覽器和輸入,還有連接到服務器。 當然,它通過無線網絡在本地網絡中工作,並將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) 
+0

套接字在無法連接時報告的實際錯誤是什麼? –

+0

這聽起來像是一個網絡問題,而不是編程問題。嘗試詢問[ServerFault](http://serverfault.com)。 –

回答

0

這顯然是一個網絡問題,而不是編碼問題。

爲了通過Internet訪問RPi,您需要一個公共 Internet IP地址,該IP地址可以將流量路由到RPi。如果您希望客戶端使用靜態主機名而不是IP直接連接,則需要進行DNS註冊(本例中由weaved.com提供),將所需主機名映射到當前IP地址。

對於IP地址本身,RPI需要兩種:

  1. 自己的直接連接到互聯網,所以它具有由ISP分配的公共IP地址。

  2. 要連接到具有公用互聯網IP地址的局域網。 LAN路由器必須配置端口轉發,以將外部流量轉發到RPi。客戶端將連接到直接連接到Internet的路由器,然後路由器將連接轉發到RPi。

無論哪種方式,您的ISP也不能阻止入站客戶端連接。一些ISP阻止客戶託管他們自己的服務器,或者他們爲該功能收取額外費用。檢查您的ISP。

當您的客戶端應用程序和RPi位於您LAN的同一側時,例如當兩者都通過WiFi連接到相同路由器時,這些問題並不是一個因素。因此,簡而言之,請確保您有一個公共IP地址,它提供了一種可行的路徑來在RPi和外部Internet客戶端之間交換數據包,並確保您有一個可以解析爲該IP地址的靜態主機名。

+0

我在weaved.com中有「GENERIC TCP」。我可以使用用Eclipse編寫的客戶機通過'proxy11.yoics.net'名稱主機從PC進行連接。我在android中做同樣的事情,但有一個問題。爲什麼在Java中的PC上工作正常,但相同的代碼(幾乎,但這部分是相同的)不? – Magnus2005

+0

如果客戶端在PC或Android設備上運行,則無關緊要。重要的是網絡設置。如果您的電腦可以連接,但Android設備無法連接,那麼您的電腦必須採取不同的聯網路線才能連接到RPi,而不是公共互聯網。我只是嘗試從我的機​​器連接到'proxy11.yoics.net:54812',但它無法連接(我可以ping IP)。因此,您顯然沒有正確配置您的網絡路由,以允許客戶端通過公共Internet連接到您的RP​​i。這意味着這個問題應該在ServerFault而不是StackOverflow上。 –

+0

那麼除了端口轉發之外,沒有選擇可以通過android從移動互聯網連接到RPi嗎?那麼爲什麼有這種服務編織。 COM? – Magnus2005

相關問題