클라이언트 코드

package com.blog.naver.fiesta77.client;

import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class ClientTest {
  private static final String CONN_HOST = "www.host.com";
  private static final int    CONN_PORT = 12345;
  public static void main(String[] args) {
    Socket socket = null;
    try {
      socket = new Socket(CONN_HOST, CONN_PORT);
      DataInputStrean in = new DataInputStream(socket.getInputStream());
      DataOutputStream out = new DataOutputStream(socket.getOutputStream());

      int message = in.readInt();
      System.out.printf("recv message is %d\n", message);
      message *= 10;
      out.writeInt(message);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (socket != null) try { socket.close(); } try (IOException e) {}
    }
  }
}


코드 분석


클라이언트 소켓 프로그래밍은 서버 소켓 프로그래밍과 별반 차이가 없다.
자바의 net 패키지가 워낙에 쉽게 소켓 프로그래밍을 할 수 있도록 만들어서인데
ServerSocket 대신 Socket 객체를 생성할 때 접속할 호스트와 포트만 넘겨주면 끝이다.
그 이후는 서버 프로그래밍과 마찬가지로 InputStream과 OutputStream으로 데이터를 넘겨주면 끝이다.
(Stream은 바이너리 형식이므로 만약 String을 사용할 예정이라면 Reader를 사용하면 된다.)

ServerSocket 소스

package com.blog.naver.kmdigit.server;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class TestServer {
  private static final int SERVER_PORT = 12345;

  public static void main(String[] args) {
    ServerSocket server = null;
    Socket       socket = null;
    try {
      server = new ServerSocket(SERVER_PORT);
      DataInputStream  in = null;
      DataOutputStream out = null;
      System.out.printf(">> server open port(%d)\n", SERVER_PORT);
      while ((socket = server.accept()) != null) {
        System.out.printf(">> accept socket host(%s)\n", socket.getInetAddress());
        int recv_message = in.readInt();
        int send_message = recv_message * 10;
        out.writeInt(send_message);
        socket.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (server != null) try { server.close(); } catch (IOException e) {}
    }
  }
};


소스 분석

JAVA에서 서버 프로그래밍을 하기 위해선 미리 만들어진 net 패키지의 ServerSocket과 Socket을 사용하면 된다.
ServerSocket의 생성자는 다양하지만 일반적으로 Listen 하는 PORT만 입력하여 사용한다.
후엔 accept 함수로 Listen 상태가 되어 클라이언트가 접속할 수 있는 준비를 한다.

accept 함수의 리턴 값은 접속한 클라이언트와 따로 통신할 수 있는 Socket 객체이다.
이제부터는 ServerSocket이 아닌 Socket 객체로 접속한 클라이언트와 통신하게 된다.
String을 주고받을 땐 Reader를 활용하면 되지만 일반적으로 String보단 Binary 통신을 훨씬 많이 하기 때문에
예제로 DataInputStream과 DataOutputStream을 사용하였다.

DataInputStream은 readXXX 함수를 통해 필요한 크기만큼의 값을 수신할 수 있으며
DataOutputStream은 writeXXX 함수를 통해 필요한 크기만큼의 값을 송신할 수 있다.
이때 DataInputStream이나 DataOutputStream을 close 시키면 안 되는데
이유는 Socket의 송/수신 채널이 막히기 때문이다.
더 이상 사용을 하지 않을 땐 DataInputStream과 DataOutputStream 대신 Socket 객체를 close 시키면 마무리된다.

+ Recent posts