2013년 2월 19일 화요일

[Java] TCP

TCP 프로토콜?
  • TCP는 Socket 과 ServerSocket를 사용하여 데이터를 주고 받습니다.
  • Socket 은 목적지 정보를 전송 수신하는 역할을 합니다.
  • ServerSocket 은 포트 번호와 Client와 연결되는 서버의 최대 연결 수를 지정 할 수 있습니다.
◆ 장점
  • 신뢰성(데이타 손실이 없습니다.)
  • 양뱡향 통신 가능
  • 바이트 스트림 지원
◆ 단점
  • UDP에 비해 다소 느릴 수 있음.
Client 예제
/*  * 클라이언트에서 작업할 내용  
 * 1)소켓 객체 생성(ip, port지정) ==> 해당 ip에 접속하여 정상적인 접속이 완료되면 객체가 생성  
 * 2)I.O 스트림 열기  
 * 3)자료 송/수신  
 * 4)소켓 닫기 
 * */
public class TestClient {
 static Socket s;

 public TestClient() throws IOException {
  s = new Socket("127.0.0.1", 9999); // 서버주소

  BufferedReader reader = new BufferedReader(new InputStreamReader(
    s.getInputStream()));
  PrintWriter writer = new PrintWriter(s.getOutputStream());
  String msg = "Strat!!";
  String rMsg = null;
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  while (!msg.equals("bye")) {
   System.out.print("전송입력 : ");
   msg = in.readLine();
   writer.print(msg);
   writer.flush();
   System.out.println("가는 중...");
   rMsg = reader.readLine();
   System.out.print("받은 메세지:" + rMsg);
  }
 }

 public static void main(String[] args) throws IOException {
  try {
   new TestClient();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    s.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

  • 주소와 포트번호와 함께 Socket을 생성 합니다.
  • 바이트 스트림을 지원 하므로 바이트 형태로 데이타를 주고 받습니다.
  • in.readLine()으로 입력 받은 문자를 writer.print(msg)을 사용하여 Server에 보내고 writer.flush() 시켜줍니다.
  • rMsg = reader.readLine()은 Server에서 받은 메세지를 한줄씩 읽습니다.
  • BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream())) 와 PrintWriter writer = new PrintWriter(s.getOutputStream())에서 전송한 데이타와 수신한 데이터를 알 수 있습니다.

Server 예제
/*  * 서버에서 수행하는 일  
 *   1)서버소켓 객체 생성  
 *   2)클라이언트 접속 대기  
 *   3)자료 송/수신  
 *   4)소켓 닫기 */
public class TestServer {
 static ServerSocket ss = null;
 static Socket s = null;

 public TestServer() throws IOException {
  ss = new ServerSocket();
  s = new Socket();
  ss = new ServerSocket(9999);
  System.out.println("클라이언트 접속 대기 중...");
  s = ss.accept();
  System.out.println("클라이언트 접속!!");
  BufferedReader reader = new BufferedReader(new InputStreamReader(
    s.getInputStream()));
  PrintWriter write = new PrintWriter(s.getOutputStream());
  String msg = "Start!";
  while (!msg.equals("bye")) {
   System.out.println("받는 중...");
   msg = reader.readLine();
   System.out.println("수신데이타 : " + msg);
   write.println(msg);
   write.flush();
  }
 }

 public static void main(String[] args) {
  try {
   new TestServer();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    ss.close();
    s.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
}

  • ServerSocket으로 포트 번호를 맞춰 줍니다.
  • s = ss.accept() 부분이 Client가 접속하기를 기다리는 부분입니다. 서버는 클라이언트가 접속하기 전까지 대기하고있는 상태입니다.
  • msg = reader.readLine() 위에 스트림으로 받은 데이터를 다시 Client로 전송하는 부분입니다.

TCP를 설명하기 위해 간단히 작성된 소스입니다. 요약하자면 Client에서 Socket 를 사용하여 목적지(서버)의 주소와 포트번호를 설정하여 보내면 서버에서는 ServerSocket 에서 포트를 맞추고 accept()에서 접속하기를 기달리고 있다가 스트림을 이용하여 다시 전송하는 코드입니다.

관련글
  1. [Java] UDP
  2. [Java] 객체 저장(OutputStream, inputStream, BufferStream)

댓글 없음:

댓글 쓰기