Language/Java

TCP/IP 소켓 통신이란?

park_juyoung 2018. 12. 15. 21:15

소켓(Socket)의 정의


소켓(Socket)은 1982년 BSD(Berkeley Software Distribution) UNIX 4.1에서 처음 소개되었으며 현재 널리 사용되는 것은 1986년의 BSD UNIX 4.3에서 개정된 것입니다.

 

소켓은 소프트웨어로 작성된 추상적인 개념의 통신 접속점이라고 할 수 있는데 네트웍 응용 프로그램은 소켓을 통하여 통신망으로 데이터를 송수신하게 된다. 


소켓은 응용 프로그램에서 TCP/IP를 이용하는 창구 역할을 하며 응용 프로그램과 소켓 사이의 인터페이스 역할을 하고 있습니다. 

 

두 프로그램이 네트워크를 통해 서로 통신을 수행할 수 있도록 양쪽에 생성되는 링크의 단자입니다.

두 소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있습니다.

결국 소켓이 구현됨으로써 네트워크 및 전송 계층의 캡슐화가 가능해집니다. 

소켓은 원래 캘리포니아 버클리 대학 분교에서 UNIX용으로 개발되었으며, 

UNIX에서의 입출력 메소드의 표준인 개방/읽기/쓰기/닫기 메커니즘을 따릅니다. 


기본적으로 소켓은 통신을 위한 일종의 통로라고 생각할 수 있습니다. 기본적으로 소켓은 상대방에게

데이터를 보내거나 받는 역할을 하며, 연결을 수동적으로 기다리느냐 , 능동적으로 연결을 하느냐로!!

[ 서버 ] 냐 [ 클라이언트] 냐 구분할 수 있습니다.

(기능상 이런거지 서버와 클라이언트의 정의는 아닙니다.)



TCP/IP Socket 통신에 대해 알아보자.

 

- 클라이언트 프로그램과 서버 프로그램은 각각 자신이 포트를 통해 통신해야 한다. 연결을 할때도 포트를 사용하고 데이터를 교환할때도 포트를 사용한다.  자바 프로그램 안에서 포트를 사용하기 위해서는 소켓을 이용해야 한다.  자바안에서 소켓의 종류에는 서버소켓과 클라이언트 소켓이 있다.

 

 

Server Socket ( 서버 소켓 )

 

 - 서버 소켓은 말그대로 서버 프로그램에서만 사용하는 소켓이다. 서버소켓은 클라이언트로부터 연결 요청이 오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만드는 일을 한다.

 

 

Client Socket ( 클라이언트 소켓 )

 

 - 클라이언트 소켓은 기대랄 필요가 없기 때문에 바로 클라이언트 소켓을 생성한다. 클라이언트 프로그램에서 클라이언트 소켓은 서버프로그램으로 연결요청을 하는것과 데이터 전송을 하는 일을 한다.



서버 소켓과 클라이언트 소켓을 생성하고 사용하는 방법에 대해 알아보겠습니다.

 

 

서버 소켓 사용방법

 

 - ServerSocket server = new ServerSocket( 포트번호 );

 

//클라이언트로부터 연결 요청이 들어오면 연결을 맺고 클라이언트 소켓을 생성해 리턴한다.

 - Socket socket = server.accept();

 

 

클라이언트 소켓 사용방법


 - Socket socket = new Socket ( 서버 아이피번호 , 서버 포트번호 );

 

서버, 클라이언트간 데이터 전송방법

//데이터 수신에 사용할 입력 스트림 객체를 리턴.

InputStream input = socket.getInputStream();


//데이터 송신에 사용할 출력 스트림 객체를 리턴.

OutputStream output = socket.getOutputStream();

//파라미터로 넘겨준 데이터 송신.

String data = "Hello Yunjin";

output.wite(data);


//수신된 데이터를 읽어서 리턴.

String data = input.read();


//소켓을 닫는 메서드

socket.close();

 

//서버 소켓을 닫는 메서드

serverSocket.close();




--------------------------- Socket Exam ---------------------------

다음 예제를 실행하기 위해서는 2개의 컴퓨터를 사용하거나 커맨드 창을 두개 켜서 실행시키면 된다 ( win + R  -> cmd )

 

 

//클라이언트 소켓 코드


 

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
import java.io.*;
import java.net.*;
 
public class clintSocket {
    public static void main(String[] args) {
        Socket socket = null;
  
        try {
 
        //
        socket = new Socket("192.168.0.4",9000);
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
  
        String str = "Hello, Yunjin Server";
        out.write(str.getBytes());
        byte arr[] = new byte[100];
        in.read(arr);
        System.out.println(new String(arr));
        } catch (IOException e) {
        // TODO Auto-generated catch block
        String msg = e.getMessage();
        System.out.println(msg);
        }finally {
            try{
                socket.close();
            }catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
 
}
cs

 

//서버 소켓 코드


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
import java.net.*;
import java.io.*;
 
public class serverSocket {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
            Socket socket = null;
   
            try {
                serverSocket = new ServerSocket(9000);
                socket = serverSocket.accept();
    
                InputStream in  = socket.getInputStream();
                OutputStream out = socket.getOutputStream();
    
                byte arr[] = new byte[100];
                in.read(arr);
                System.out.println(new String( arr));
                String str = "Hello, YunJin Client";
    
                out.write(str.getBytes());
       
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println(e.getMessage());
            }finally {
                try {
                    socket.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                }
    
                try {
                    serverSocket.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                }
            }
        }
}
cs