2016-06-10 3 views
0

모바일 인터넷을 통해 Raspberry Pi의 Android 전화와 서버 간의 연결에 문제가 있습니다. 안드로이드에서 RPi와 클라이언트에 간단한 서버를 만들었습니다. 나는 또한 DNS 문제에 Weaved 소프트웨어를 설치했다. 내가 즉 이클립스에있는 다른 PC에 간단한 클라이언트를 사용할 때 나는 서버를 사용하여 즉에 연결할 수 있습니다IP 대신 호스트 이름을 사용하기 때문에 소켓이 모바일 인터넷을 통해 서버에 연결할 수 없습니다. 즉, Eclipse 및 WIFI를 통해 작동합니다.

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

같은 안드로이드에 내가 WIFI를 사용하는 경우. WIFI를 끄면 문제가 시작됩니다. 소켓 소켓에 연결하지 않았습니다. 나는 허가를 설정했다 :

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

예외는 없다. 소켓이 성공적으로 생성되었지만 서버에 연결되지 않았습니다.

즉 나는 웹 브라우저에

proxy.11.xxx.net:54812 

를 넣어 입력 서버에 대한 연결이 있습니다. Ofcourse는 WIFI를 통해 로컬 네트워크에 연결되어 있고 RPi의 직선 IP 번호를 넣었을 때 작동하지만 그것이 의미하는 바가 아닙니다. 안드로이드에서 인터넷을 통해 유능한 사람들과 연결하고 싶습니다. 왜 내가 PC에서 안드로이드에 같은 주소를 연결할 수 있습니까?

누구나 도움을 주실 수 있습니까? 내가 사용하는 경우

는 :

편집 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

이 명확 네트워킹 문제가 아니라 코딩 문제입니다.

인터넷을 통해 RPi에 액세스하려면 공용 RPi에 트래픽을 라우팅 할 수있는 인터넷 IP 주소가 필요합니다. 그리고 클라이언트가 IP 대신 직접 정적 호스트 이름을 사용하여 연결하게하려면 원하는 호스트 이름을 현재 IP 주소에 매핑하는 DNS 등록 (이 경우 weaved.com에서 제공)이 필요합니다. IP 주소 자체에 대한

, RPI는 필요 중 하나

  1. 인터넷에 자신의 직접 연결, 그것은 당신의 ISP에 의해 할당 된 공인 IP 어드레스를 가지고 있으므로.

  2. 공용 인터넷 IP 주소가있는 LAN에 연결해야합니다. LAN 라우터에는 외부 트래픽을 RPi로 전달하도록 포트 포워딩을 구성해야합니다. 클라이언트가 인터넷에 직접 연결된 라우터에 연결하면 라우터가 RPi에 연결을 전달합니다.

어떤 방법으로도 ISP는 인바운드 클라이언트 연결을 차단하지 않아야합니다. 일부 ISP는 고객이 자체 서버를 호스팅하지 못하도록 차단하거나 해당 기능에 대해 추가 요금을 부과합니다. ISP에 문의하십시오.

이러한 문제는 클라이언트 앱과 RPi가 둘 다 WiFi를 통해 동일한 라우터에 연결된 경우와 같이 LAN의 같은면에있는 경우 요소가 아닙니다.

간단히 말해서 RPi와 외부 인터넷 클라이언트간에 데이터 패킷을 교환 할 수있는 공용 IP 주소가 있는지 확인하고 해당 IP 주소로 확인할 수있는 고정 호스트 이름을 가지고 있는지 확인하십시오 .

+0

weaved.com에 "일반 TCP"가 있습니다. 이클립스로 작성된 클라이언트를 사용하여'proxy11.yoics.net'라는 이름의 호스트를 통해 PC와 연결할 수 있습니다. 나는 안드로이드에서 같은 일을하지만 문제가있다. Java에서 PC를 사용하는 이유는 무엇입니까?하지만 동일한 코드 (거의 동일하지만이 부분은 동일)가 아닙니까? – Magnus2005

+0

클라이언트가 PC 또는 Android 장치에서 실행 중인지 여부는 중요하지 않습니다. 중요한 것은 네트워크 설정입니다. PC를 연결할 수는 있지만 안드로이드 장치는 연결할 수 없다면 PC는 공용 인터넷이 아닌 RPi에 연결하기 위해 다른 네트워킹 경로를 취해야합니다. 방금 내 컴퓨터에서'proxy11.yoics.net : 54812'에 연결하려고 시도했지만 연결이되지 않습니다 (IP를 핑할 수 있습니다). 따라서 클라이언트가 공용 인터넷을 통해 RPi에 연결할 수 있도록 네트워크 라우팅을 올바르게 구성하지 않았 음이 분명합니다. 즉,이 문제는 StackOverflow 대신 ServerFault에 있어야합니다. –

+0

포트 포워딩을 제외하고 안드로이드에서 모바일 인터넷을 통해 RPi에 연결할 수있는 옵션이 없습니까? 그렇다면이 서비스가 왜 만들어 졌는가? com? – Magnus2005