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

와이파이를 이용한 데이터 송수신에 대해 질문

0 추천

스마트 폰 -> 공유기-> 펌웨어(192.168.0.9) 이렇게 데이터가 전달하도록 코드를 만들었습니다. 그런데 스마트폰-> 공유기-> 다른 펌웨어(198.168.0.9) 으로 데이터가 전송하는 코드로 바꾸고 싶은데 이때 공유기로부터 전달받는 단말기의 IP 주소만 변경하면 된다고 생각해서 바꿨는데 연결이 되지 않습니다. ​

제가 아직 이쪽 부분에 미흡하기 때문에 도저히 혼자서 해결을 못하겠어요ㅠㅠ​

config 부분

public class Config {
    private String url ="121.254.162.249";
    private String ip ="121.254.162.249";
    private String gateway = "192.168.0.9";

    private int rack = 0;
    private int slot = 2;

    private int port3 = 3000;
   
    public String getIp()           {       return ip;          }
    public String getUrl()          {       return url;         }
    public String getGateway()      {       return gateway;     }
   
    public int getRack() {  return rack; }
    public int getSlot() {  return slot;   }

    public int getPort3()           {       return port3;       }
    public int getPort4()           {       return port4;       }
}

연결 코드 부분

(연결이 되면 이미지가 변환하게 했습니다.)

 

private class GATEWAY1 extends Thread {
    private static final String TAG = "GATEWAY Thread";
    private Socket socclient = null;
    private PrintWriter out = null;
    private String str2 = "";
    private String beforeState = "";
    private boolean sock_err_flag = false;
    private int sock_err_count = 0;
    private int str2_count = 0;

    public void run() {

        while (GATE_FLAG1) {

            try {
                socclient = new Socket();
                InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(config.getGateway()), config.getPort3());

                socclient.connect(socketAddress, 350);
                socclient.setTcpNoDelay(true);
                out = new PrintWriter(socclient.getOutputStream(), true);
                out.write(GATEWAY_ORDER + "\n");
                out.flush();
                GATEWAY_ORDER = "sen";
                str2 = "";

                if (str2.equals("")) {
                    str2_count++;
                } else {
                    str2_count = 0;
                }

                if (beforeState.equals(str2)) {
                    //Log.e("상태 값이같음 이미지변경안함","beforeState: "+beforeState+", str2 :"+str2);
                    //같으면 이미지변경 x
                    if (str2.equals("") && str2_count > 3) {

                    }
                } else {
                    if (str2.equals("") && str2_count > 3) {
                        GT_handler.sendEmptyMessage(0);

                    } else {
                        GT_handler.sendEmptyMessage(1);

                    }
                    beforeState = str2;
                }
                if (socclient.isConnected()) {
                    GT_handler.sendEmptyMessage(1);
                }

                sock_err_flag = false;
                sock_err_count = 0;
            } catch (Exception e) {
                e.printStackTrace();
                if (sock_err_flag) {
                    GT_handler.sendEmptyMessage(0);
                    GT_handler.sendEmptyMessage(5);
                    GT_handler.sendEmptyMessage(6);
                }
                sock_err_count++;
                if (sock_err_count > 4) {
                    sock_err_flag = true;
                }
            } finally {
                try {
                    //socclient.close();
                    if (out != null) {
                        out.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
혜둉이 (200 포인트) 님이 2020년 12월 11일 질문
private class GATEWAY extends Thread {
    private static final String TAG = "GATEWAY Thread";
    private PrintWriter out = null;

    public void run() {
        // 스레드에게 수행시킬 동작들 구현
        while (GATE_FLAG) {
            try {
                socclient = new Socket();
                InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(config.getGateway()), config.getPort3());
                socclient.connect(socketAddress, 350);
                out = new PrintWriter(socclient.getOutputStream(), true);
                // Log.e("GATEWAY_ORDER","GATEWAY_ORDER :"+GATEWAY_ORDER);
                out.write(GATEWAY_ORDER);
                out.flush();
            } catch (Exception e) {
                //Log.e("소켓통신에러", "ERR" + e.getMessage());
            } finally {
                try {
                    socclient.close();
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                if (thread6.isAlive()) {
                    thread6.sleep(10);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();}}}}

게시글이 길어 댓글에 마저 코드 넣었습니다.

1개의 답변

+1 추천
 
채택된 답변
펌웨어라고 표현하는 것은 어떤 하드웨어인가보네요.
같은 공유기에 펌웨어1, 펌웨어2가 다 연결되어 있다고 한다면,
당연히 접근이 되어야겠죠.

여러가지 이슈가 있을 수 있어서 다 나열하기는 힘들겠네요.
가장먼저 생각할 수 있는 것은

예상 문제1:
펌웨어2가 펌웨어1의 환경이 다르다.
즉 펌웨어1에는 어떤 소켓 서비스가 떠러 폰의 데이터를 받아줄텐데,
펌웨어 2에서는 그 소켓 서비스가 떠 있지 않다.
텔넷 같은 프로그램으로 윈도우즈나 맥에서 해당 ip 주소와 포트에 접속을 해보면 확인이 됩니다.
접속이 안되면 폰의 문제가 아니라는 것이죠.

예상 문제2:
 펌웨어2의 IP 주소가 잘못되어 있거나,
 또는 소켓서비스가 떠 있지만, 다른 포트로 떠 있을 수 있다. (확인이 필요)
 텔넷 같은 프로그램으로 윈도우즈나 맥에서 해당 ip 주소와 포트에 접속을 해보면 확인이 됩니다.
 마찬가지로 접속이 안되면 폰의 문제가 아니라는 것이죠.

 

예상 문제3:
 같은 공유기에 붙어있는게 아니라면 당연히 접속이 어렵습니다.

 

예상 문제4:

 버팔로 공유기의 경우 유선랜과 무선랜이 서로 못보게 되어 있는 세팅이 기본이더군요.
 공유기에서 섹션을 구별해서 서로 접속이 안되게 막을 수도 있습니다.

 

그외에 수많은 케이스가 있어서 와이파이는 생각보다 어려운 환경인 것 같네요.
힘을 내시길~
Will Kim (43,170 포인트) 님이 2020년 12월 15일 답변
혜둉이님이 2020년 12월 15일 채택됨
다른 포트로 연결되어 있었어요!! 감사합니다. 5일만의 고민이 해결됬어요^-^
도움이 되어서 다행이네요~ ^^*
...