마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 폰끼리 tcp 통신 EHOSTUNREACH 에러좀 도와주세요

0 추천

제가 지금 안드로이드 끼리 tcp 통신하는 것을 하려고 인터넷 뒤적이며 하고있는데

자기폰에서야 당연이 되지만 다른 폰을 서버로 하고 연결하려고 하면

connect failed: EHOSTUNREACH (No route to host) 에러로 안되고 있어요.

adbreverse tcp:포트 tcp:포트 로 포트를 열어야 한다는 글을 봐서 이것도 해보고

안드로이드에 핑을 쏴보라는 글도 봐서 해봤지만 호스트에 연결할수 없습니다. 만 나오고있어요

같은 네트워크 망인건 와이파이 이름이 같은것도 확인 했어요.

소스코드는 현재 블로그 분의 소스로 해보고 있고요. 다시 만들고 이것저것 해봐도 안되네요 

 

 Collections.synchronizedMap(clientsMap);
        try {
            serverSocket = new ServerSocket(9999);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        /** XXX 01. 첫번째. 서버가 할일 분담. 계속 접속받는것. */
                        Log.v("", "서버 대기중...");
                        try {
                            socket = serverSocket.accept();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        Log.v("", socket.getInetAddress() + "에서 접속했습니다.");
                        msg = socket.getInetAddress() + "에서 접속했습니다.\n";
                        handler.sendEmptyMessage(SERVER_TEXT_UPDATE);

                        new Thread(new Runnable() {
                            private DataInputStream in;
                            private DataOutputStream out;
                            private String nick;

                            @Override
                            public void run() {

                                try {
                                    out = new DataOutputStream(socket.getOutputStream());
                                    in = new DataInputStream(socket.getInputStream());
                                    nick = in.readUTF();
                                    addClient(nick, out);

                                } catch (IOException e) {
                                    e.printStackTrace();
                                }

                                try {// 계속 듣기만!!
                                    while (in != null) {
                                        msg = in.readUTF();
                                        sendMessage(msg);
                                        handler.sendEmptyMessage(SERVER_TEXT_UPDATE);
                                    }
                                } catch (IOException e) {
                                    // 사용접속종료시 여기서 에러 발생. 그럼나간거에요.. 여기서 리무브 클라이언트 처리 해줍니다.
                                    removeClient(nick);
                                }
                            }
                        }).start();
                    }
                }
            }).start();

 

 clientSocket = new Socket(joinIpText.getText().toString(), 9999);
                    Log.v("", "클라이언트 : 서버 연결됨.");

                    clientOut = new DataOutputStream(clientSocket.getOutputStream());
                    clientIn = new DataInputStream(clientSocket.getInputStream());

                    //접속하자마자 닉네임 전송하면. 서버가 이걸 닉네임으로 인식을 하고서 맵에 집어넣겠지요?
                    clientOut.writeUTF(nickName);
                    Log.v("", "클라이언트 : 메시지 전송완료");

                    while (clientIn != null) {
                        try {
                            clientMsg = clientIn.readUTF();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(CLIENT_TEXT_UPDATE);

 

바프스 (150 포인트) 님이 2018년 7월 2일 질문

1개의 답변

0 추천
 
채택된 답변
EHOSTUNREACH 는 호스트를 찾을 수 없을 때 발생합니다.

연결을 어떤 방식으로 하셨나요? 3G/LTE 연결로 할 경우 일부 포트를 제외하곤 차단될 수 있습니다.

wifi로 하셨다면, 같은 공유기에 물렸는지 확인 해 보시고, 같은 공유기에 두 단말이 물렸다면,

서버로 쓸 단말 부터 실행 하여 9999 port를 listen하게 한 후

클라이언트로 쓸 단말에서  "joinIpText.getText().toString()" 로 반환되는 값이 접속할 단말의 IP 와 동일한지 확인 한 후 실행 해 보세요.

(단말의 소켓을 다른 곳에서 물고 있을 수 있으니. 리붓후 시도 하시는 것도 방법입니다.)
익명사용자 님이 2018년 7월 2일 답변
바프스님이 2018년 7월 3일 채택됨
같은 공유기는 맞아요.public void serverCreate() {
        Collections.synchronizedMap(clientsMap);
        try {
            serverSocket = new ServerSocket(9999);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        /** XXX 01. 첫번째. 서버가 할일 분담. 계속 접속받는것. */
                        Log.d("TCPTEST", "서버 대기중...");
                        try {
                            socket = serverSocket.accept();
                        } catch (IOException e) {
                            Log.d("TCPTEST","SERVERCREATE : "+e.toString());
                            e.printStackTrace();
                        }
                        Log.d("TCPTEST", socket.getInetAddress() + "에서 접속했습니다.");
                        msg = socket.getInetAddress() + "에서 접속했습니다.\n";
                        handler.sendEmptyMessage(SERVER_TEXT_UPDATE);

                        new Thread(new Runnable() {
                            private DataInputStream in;
                            private DataOutputStream out;
                            private String nick;

                            @Override
                            public void run() {

                                Log.d("TCPTEST",socket.isConnected()+" : isConnected");

                                try {
                                    out = new DataOutputStream(socket.getOutputStream());
                                    in = new DataInputStream(socket.getInputStream());
                                    nick = in.readUTF();
                                    addClient(nick, out);

                                } catch (IOException e) {
                                    Log.d("TCPTEST",e.toString());
                                }

                                try {// 계속 듣기만!!
                                    while (in != null) {
                                        msg = in.readUTF();
                                        sendMessage(msg);
                                        handler.sendEmptyMessage(SERVER_TEXT_UPDATE);
                                    }
                                } catch (IOException e) {
                                    Log.d("TCPTEST",e.toString());
                                    // 사용접속종료시 여기서 에러 발생. 그럼나간거에요.. 여기서 리무브 클라이언트 처리 해줍니다.
                                    removeClient(nick);
                                }
                            }
                        }).start();
                    }
                }
            }).start();
이렇게 서버 열고 있고요.
 adb connect로 폰 와이파이의 ip를 해봐요 연결이 안되네요..폰에서 무슨 설정을 해줘야하나요. ?
코드상 서버쪽 문제는 아닐 듯 하고, 폰의 IP 문제일 듯 한데...
 무선랜 설정 고급 메뉴 같은데 나오는 IP가 맞는지 확인 해 보세요..

adb connect로 폰 와이파이의 ip를 해봐요 연결이 안되네요.
=> 무슨말씀이신지 이해가 안가네요..adb remote연결과 동작이 안되는 건 상관이 없을 듯 한데요.. adb remote연결의 경우 보안 문제로 단말에 따라 막아 뒀을 수도 있습니다.
찾다가 adb remote 라는걸 봐서요 . 혹시나 해서 여쭤봤어요.
사용하는 와이파이가 인터넷만 가능하도록 막혀있었네요 ㅎㅎ
도움 주셔서 정말 감사합니다.
...