2015-02-06 4 views
1

나는 안드로이드 채팅 응용 프로그램을 만들고있어 현재 결국 몇 천 사용자를 위해 일해야이 전화로 테스트입니다NAT 라우터 뒤에있는 ServerSocket에 어떻게 액세스합니까?

목표.

문제

나는이 전화는 소켓을 통해 서로 연결을 시도 할 때마다 "연결 거부"라는 ConnectionException를 얻을.

현재 디자인

각 전화, ServerSocket를 시작 일부 소켓에 연결을 기다리는 동의() 메서드를 호출하고, 중 전화하는 클라이언트 소켓을 작성합니다 먼저 메시지를 보냅니다. 나는 내가 사용하고있는 IP 주소가 맞다는 것을 확신한다. (그들은 실제로 같은 외부 IP를 사용하고있다.) 문제는 포트에 있다고 생각합니다. 나는 무작위로 포트 번호를 생성하고, 사용이 자유라면 ServerSocket s = new ServerSocket(randomPortNumber)라고 말합니다.

은 내가 생각하는 나는 문제가이 포트 번호는 NAT 라우터 뒤에 앉아 하나입니다 생각 어떤 문제

의 원천입니다. 따라서 소켓이 Socket socket = new Socket(ip, serverSocketRandomPortNumber)과 같은 것을 사용하여 ServerSocket에 연결을 시도하면 NAT 라우터에 연결하여 라우터 자체가이 포트에서 수신 대기하지 않으므로 작동하지 않는이 포트 번호를 피드에 넣으려고 시도하지만 뒤에있는 전화 라우터가 있습니다.

질문과 생각

내 질문에, 어떻게이 문제를 해결 할 수있다?

디자인을 변경해야합니까?

필자가 생각한 대체 설계는 웹 호스트에서 단일 ServerSocket을 사용하고이를 사용하여 클라이언트 소켓에서 다른 클라이언트 소켓으로 보낸 메시지를 리디렉션하는 것입니다. http://php.net/manual/en/sockets.examples.php

그리고 난 여전히 클라이언트 측 자바를 사용합니다 :

나는이 라인을 따라 뭔가를 참조 PHP에서 서버 측 구현 될 것입니다.

답변

2

전화기 중 하나가 NAT 라우터 뒤에 있기 때문에 라우터에서 포트 전달 (또는 다른 기술)이 활성화되어 있지 않으면 전화에 하나의 연결을 시작할 수 없습니다.

채팅 응용 프로그램이 구현되는 일반적인 방법은 모든 클라이언트가 연결할 공통 서버입니다.

정말로 원하지 않는 한 자신 만의 채팅 서버를 작성할 필요는 없습니다. XMPP 프로토콜을 사용하는 것이 좋습니다. 이미 만들어진 서버 목록 here. 클라이언트 측 (Android)에서는 here을 사용할 수있는 라이브러리를 찾을 수 있습니다.

+0

그래서 포트 전달이 실제로 가능하지 않으므로 서버를 사용해야합니다. 그래서 서버가 실제로 무엇을하는지 말해 주실 수 있습니까? 다른 네트워크에있는 두 장치간에 통신하는 것이 어떻게 도움이됩니까? 여기에 질문하는대로 용서해주세요. 나는 네트워킹에 익숙하지 않고 어떤 자원도 찾을 수 없습니다. –