WIZnet Developer Forum

Java로 TCP/IP socket 통신에 대해서

현재 WIZ107SR로 TCP 서버로 사용중입니다.

아래와같은 코드로 접속을 시도했지만 커넥션 타임아웃이납니다.

public class EchoClient {

public static void main(String[] args){
    ApplicationContext context =
            new ClassPathXmlApplicationContext("classpath:spring/context-common.xml",
                    "classpath:spring/context-datasource.xml",
                    "classpath:spring/context-mapper.xml",
                    "classpath:spring/context-transaction.xml");
    EchoService es=(EchoService)context.getBean("es");


    try{

        // 1. 서버의 IP와 서버의 동작 포트 값(10001)을 인자로 넣어 socket 생성
        Socket sock = new Socket("127.0.0.1", 5678);
        BufferedReader keyboard =
                new BufferedReader(new InputStreamReader(System.in));

        // 2. 생성된 Socket으로부터 InputStream과 OutputStream을 구함
        OutputStream out = sock.getOutputStream();
        InputStream in = sock.getInputStream();

        // 3. InputStream은 BufferedReader 형식으로 변환
        //    OutputStream은 PrintWriter 형식으로 변환
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));

        // 4. 키보드로부터 한 줄씩 입력받는 BufferedReader 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String line = null;

        // 5. 키보드로부터 한 줄을 입력받음
      while((line=br.readLine() )!= null){
          System.out.println("서버로부터 전달받은 문자열 :" + line);
          pw.println(es.EchoServiceRequester("test"));
          pw.flush();
       }
        pw.close();
        br.close();
        sock.close();

    }catch(Exception e){
        System.out.println(e);
    }
}

}

물론 저기서 서버 IP도 맞추었고…
포트도 맞추어주었는데 타임아웃이납니다.

이때문에 java로 TCP/IP 소켓서버로 만들고
package keti.tcp.module.application;

/**

  • Created by Administrator on 2016-09-12.
    */
    import keti.tcp.module.dbservice.UserService;
    import keti.tcp.module.service.EchoService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.context.support.GenericXmlApplicationContext;
    import org.springframework.stereotype.Component;

import java.net.;
import java.io.
;
import java.text.SimpleDateFormat;
import java.util.Date;

public class EchoServer {

public static void main(String[] args){
    try{

        // 1. 10001번 포트에서 동작하는 ServerSocket을 생성
        ServerSocket server = new ServerSocket(5678);
        System.out.println("Wating Connect ..");

        // 2. ServerSocket의 accept() 메소드를 실행해서 클라이언트의 접속을 대기
        // : 클라이언트가 접속할 경우 accept() 메소드는 Socket 객체를 반환
        Socket sock = server.accept();

        InetAddress  inetaddr = sock.getInetAddress();
        System.out.println(inetaddr.getHostAddress()+ " 로부터 접속했습니다.");

        // 3. 반환받은 Socket으로부터 InputStream과 OutputStream을 구함
        //OutputStream out = sock.getOutputStream();
        InputStream in = sock.getInputStream();
        OutputStream out = sock.getOutputStream();

        // 4. InputStream은 BufferedReader 형식으로 변환
        //    OutputStream은 PrintWriter 형식으로 변환
       // PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
        String line = null;

        BufferedReader keyboard =
                new BufferedReader(new InputStreamReader(System.in));
        //5. BufferedReader의 readLine() 메소드를 이용해
        //   클라이언트가 보내는 문자열 한 줄을 읽어들임
        while((line = keyboard.readLine()) != null) {
            if(line.equals("quit")) break;
            System.out.println("서버 전송 문자열 : " + line);
            // 6. PrintWriter의 println을 이용해 다시 클라이언트로 전송
            // pw.println(es.EchoServiceRequester("test"));
            pw.println(line);
            pw.flush();

            //클라 보내는값 확인
            String brtest=br.readLine();
            System.out.println("클라이언트가 보낸값:"+brtest);

        }
            // 6. IO 객체와 소켓의 close() 메소드 호출
            pw.close();
            br.close();
            sock.close();



    } catch(Exception e){
        System.out.println(e);
    }
}

}

WIZ107SR TCP client로 만들어서 접근해봤지만
역시 정상적으로 동작되지않았습니다. 아예 데이터를 못 받아옵니다.
서버 환경이 집에서 하는거라 혹시 망문제일까싶어
AWS로 서버인스턴스를 하나만든후에 거기에 배포를 해서 TCP서버를 올려보았지만
마찬가지로 WIZ107SR 는 제가 만든 TCP/IP서버로 접근을 못합니다.
해당 TCP서버에는 텔넷으로 접근도 가능했고 Putty 로 포트 찔러서도 가능했고 정상적으로 접근하는것을 확인했습니다.

과제 특성상 소켓 통신을 해서 뭔가 결과물을 보여줘야하는데 통신부분에서 아예 안되니 답답합니다.
java말고 다른 언어라도 상관없는데 연결할수 있는 무언가가 따로있나요?
답변부탁드립니다.

일단 WIZ107SR의 설정을 확인하는 것이 좋을 것 같습니다.
IP Address, Gateway를 먼저 확인해 보세요.
그래도 이상하시다면 서버의 IP주소,Gateway주소 그리고 집안의 이더넷 환경(공유기를 사용하시는지),Configuration tool 캡쳐 같은 정보를 보내주시면 시원하게 답변해 드릴 수 있을 것 같습니다. ^^

그리고 PC 소프트웨어는 무엇이라도 상관없습니다. WIZ107SR은 안되지만 비슷한 아키텍쳐를 가진 하드웨어로 facebook과도 연동도 할 수 있으니까요.

그럼 수고하세요. 즐거운 한가위 되세요. ^^

현재 공유기를 사용중입니다. 저녁쯤에 환경에대해서 ipconfig 랑 configuration tool캡쳐 정보를 올리겠습니다…
혹시 언제쯤 더 답변이 가능하신가요?

빠른답변 감사합니다.

현재 구성은 wiz108sr 이 장착된 디바이스 6대로 구성되어있으며,
5대는 tcp/ip서버로 1대는 tcp/ip 클라이언트 로 구성되어있습니다

6대 디바이스는 모두 이더넷 케이블로 스위치 허브에 연결되고, 해당 허브에서 pc로 연결을 해두었습니다, 6대 디바이스 중 tcp/ip 클라이언트로 된 디바이스는 pc에 씨리얼로 연결 되어 있습니다.

  1. Pc에서 configtool 1.4.4.1 로 search 하면 6대의 디바이스가 검색됩니다.

  2. Configtoll 사용해서 Tcp ip 클라이언트를 tcp ip 서버중 하나의 클라이언트로 설정한 뒤 tcp ip 서버쪽에서 통신패킷을 쏴주면
    Pc에서는 comport로 tcp ip 클라이언트가 받은 데이터를 확인 할 수 있습니다

서버 ~~(tcp ip연결)클라이언트(시리얼연결)~~PC comport에서 확인

  1. Pc에서 configtool 에서 모든 디바이스가 확인되고, comport로 수신데이터가 확인되지만 PC에서 각 tcp ip 서버 디바이스로 핑이나 텔넷 클라이언트로 붙거나 서버가되어 접속 자체 되질 않습니다.

  2. 방화벽은 모두 오픈 확인 되었고, 게이트웨이 설정 서브넷 설정 동일 함을 확인하였습니다

  3. Pc에서 공유기를 사용하긴 하나 연결된 스위치 허브와는 따로 분리되어 연결 되어 있습니다

Pc와 연결하기 위하여 따로 설정해야 하는 부분이 있는건지, pc와 통신 할 수 있도록 확인 부탁드립니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.