1. 소켓 (Socket)

- TCP 프로토콜을 사용하여 통신을 하는데 쓰임(TCP의 기본 : IP / Port 번호가 필요)

- 네트워크 상에서 서버, 클라이언트 두 개의 프로그램이 특정 포트를 통해 양방향 통신이 간으하도록 만들어주는 소프트웨어 장치.

- java.net에서 ServerSocket 클래스(서버측)와 Socket 클래스(서버측 + 클라이언트측)를 이용하여 서버와 클라이언트 간의 통신을 가능하게 만듦.

- 자바 채팅 프로그램의 기초는 서버 - 클라이언트 간의 연결이 가능해야 하는데, 소켓 프로그래밍으로 가능함(하나의 서버에 여러 개의 클라이언트가 접속하는 멀티 클라이언트 채팅 프로그램도 가능).

 

* IP : 컴퓨터마다 가지고 있는 고유의 주소

  port : 통신을 위한 연결 라인

 

 

2. 자바 소켓 프로그래밍 (TCP)

- 소켓 프로그래밍 중의 하나. 스트림 통신 프로토콜.

- 연결 지향 프로토콜 : 양 쪽의 소켓이 연결된 상태여야 함.

- 송신 > 수신시 차례대로, 연결된 순서대로 데이터를 교환해야 함(신뢰성이 높음).

- java.net.ServerSocket : 서버측에서 클라이언트의 접속에 대기하기 위해 필요한 클래스.

- java.net.Socket : 서버 - 클라이언트 간 통신하기 위해 필요한 클래스.

 

 

3. 자바 소켓 프로그래밍 실행 순서

 

 

4. 자바 소켓 프로그래밍 예제

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
48
49
50
51
52
package lesson01.exam02.server;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
 
//간단한 소켓 서버 프로그램. 소켓 연결이 되면 현재 시간을 출력하고 연결된 소켓을 닫음
public class SimpleSockterServer {
    static final int PORT = 8888;
    
    public static void main(String[] args) {
        
        try{
//          ServerSockter 생성 (포트 번호를 사용하는 서버 소켓)
//          서버용 소켓. 통신은 불가능하고 클라이언트의 연결만을 기다림
//          ServerSocket 소켓변수명 = new ServerSocket(포트번호);
            ServerSocket serverSocket = new ServerSocket(PORT);
            
            System.out.println("console> 서버 : 클라이언트의 접속을 기다립니다.");
            
//          소켓 서버가 종료될 때까지 무한루프
            while(true) {
//              클라이언트와 연결이 되면 실제로 통신을 하기 위해 만들어야 하는 소켓
//              서버소켓.accept();
//              클라이언트 소켓에서 요청을 할 때까지 소켓 서버가 대기 상태가 됨
//              클라이언트 소켓 수가 많아질 시 요청 횟수가 증가하면서 스레드가 늘어나면 
//              서버 자원을 많이 소모함
//              => 스레드풀(Thread Pool)이 등장하게 됨 : 다중 접속 처리가 원활해짐
                Socket socket = serverSocket.accept();
                
                System.out.println("console> 서버 " + socket.getInetAddress() + " 클라이언트와 " +
                                    socket.getLocalPort() + " 포트로 연결되었습니다.");
                
                try {
//                  응답을 통해 스트림을 얻어옴(서버에서 클라이언트의 입력을 받아들임)
                    OutputStream stream = socket.getOutputStream();
//                  현재 날짜를 받아와 출력함
                    stream.write(new Date().toString().getBytes());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
//                  소켓은 반드시 닫아야 함
                    socket.close();
                }
            }

//        예외처리

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
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
package lesson01.exam02.server;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
 
//소켓 클라이언트 프로그램. 소켓 서버에 접속하여 결과 출력하고 프로그램을 종료함
//서버 소켓은 필요 없고, InputStream을 OutputStream으로, InputStreamReader를 OutputStreamWriter로 바꾸면 됨
//서버 소켓에서 생성한 서버의 IP, port번호를 알고 있어야 함
public class SimpleSocketClient {
    static final int PORT = 8888;
    
    public static void main(String[] args) {
        try {
//          소켓 생성
            Socket socket = new Socket("localhost", PORT);
            
            System.out.println("console> PORT(" + PORT + ") 로 접속을 시도합니다.");
            
//          스트림을 얻어옴
            InputStream stream = socket.getInputStream();
//          스트림을 래핑함(클라이언트에서 서버로부터 수신 받은 메세지 받아들임)
            BufferedReader br = new BufferedReader(new InputStreamReader(stream));
            
//          결과를 읽음(서버로부터 온 메세지 수신)
            String response = br.readLine();
            
            System.out.println("console> 수신 response : " + response);
            
//          소켓 닫음
            socket.close();
            
//          프로그램 종료
            System.exit(0);

//        예외처리 

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

 클래스명

 설명

 특징

 InputStream

 byte 단위로 입력 받는 최상위 클래스

 객체화가 불가능한 추상 클래스.

 (상속 받아 사용해야 함)

 OutputStream

 byte 단위로 출력 받는 최상위 클래스

 Reader

 문자 단위 입력 스트림

 Writer

 문자 단위 출력 스트림

 BufferReader

 Buffer에 있는 IO 클래스. 읽는 클래스

 

 BufferedWriter

 Buffer에 있는 IO 클래스. 쓰는 클래스

 

 

+ Recent posts