[BE/JAVA] 소켓통신 (예제코드 포함)

    728x90
    반응형

    2022.02.02

    81번째 포스팅

     

    입사 332일차.

    참여중인 프로젝트에서 소켓통신을 개발할 일이 생겼다.

    개발방법이나 코드들은 대강 머리에 담아놓고 있었지만 실제로 개발해본 것은 처음이기 때문에 기록을 남기려고 한다.

     

     

     

    0. 소켓통신?

      ① 양쪽(서버, 클라이언트)간의 통신을 위한 문을 만들어두고, 서로간의 메세지(byte)를 주고받을 수 있게 만들어주는 인터페이스

     

     

    1. 사용하는 객체 및 메소드

    Socket connect(IP주소, 포트번호) 원격 호스트에 대한 연결을 요청합니다.
    setSoTimeOut(밀리세컨드) InputStream에서 응답메시지를 읽을 때 대기시간 설정
    getOutputStream() 해당 소켓에 바이트를 쓰기 위한 OutputStream 객체를 생성
    close() 통신연결을 닫고 연결된 리소스를 모두 해제합니다.
    isClosed() 소켓이 닫혀있는 경우 true, 열려있는 경우 false를 리턴
    OutputStream write(byte[]) 지정된 바이트 배열로부터 이 출력 스트림에 b.length 바이트를 출력합니다.
    flush() 버퍼에 들어가 있는 출력 바이트를 모두 강제적으로 출력합니다.
    close() 이 스트림에 관련된 모든 리소스를 해제합니다.
    InputStrem read(byte[],  n,  m) 읽은 바이트들을 byte 배열에 index n부터 m까지 저장.
    close() 이 스트림에 관련된 모든 리소스를 해제합니다.

     

     

    2. 예시코드

      ① 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
        public String practiceSocketConnect() {
            String socketSuccess = "N";
     
            try {
                socket = new Socket();
                socket.connect(new InetSocketAddress("192.0.0.1"8080));
                socket.setSoTimeout(30000);
                
                byte[] bytes = null;
                String sendMessage = "";
                OutputStream os = socket.getOutputStream();
                sendMessage = "전문데이터생성"
                
                // UTF-8 CharSet의 byte타입으로 인코딩
                sendBytes = sendMessage.getBytes("UTF-8");
                os.write(sendBytes);
                os.flush();
     
                InputStream is = socket.getInputStream();
                byte[] resByte = new byte[500];
                is.read(resByte, 0500);
     
                // UTF-8 CharSet의 String타입으로 인코딩
                String resStr = new String(resByte, "UTF-8");
     
                
                os.close();
                is.close();
                socket.close();
                socketSucces = "Y";
                
            } catch(Exception e) {
                System.out.println("소켓통신에 실패했습니다!");
            }
            
            // 통신이 제대로 종료되지 않은 경우, 다시 한번 종료
            if (!socket.isClosed()) {
                try {
                    socket.close();
                } catch(IOException ioe) {
                    System.out.println("소켓통신에 실패했습니다!");
                }
            }
     
            return socketSuccess;
        }
    cs

     

    3. 결과

      ① 소켓통신에 성공하면 서버에서 보내주는 byte를 읽어서 subString으로 문자열을 잘라 사용하면 된다.

    728x90
    반응형

    댓글