1. 소켓이란
1) 소켓은 네트워크 상에서 수행되는 두 프로그램 간의 양방향 통신링크의 한쪽 끝단을 의미.
2) 특정포트와 연결되어 있음.
3) 데이터 통신 시 소켓사용.
4) 종류 : 서버소켓, 클라이언트소켓

* 웹서버는 주로 80포트를 사용한다.
2. 소켓통신 프로세스(기본적인 소켓통신의 구조)

1) ServerSocket : listener = new ServerSocket(서버포트);
- 서버는 포트를 열어놓고 기다리고 있는다.
- 한 서버는 여러 클라이언트와 붙을 수 있다 = 여러개의 소켓을 생성할 수 있다.
- 서버는 클라이언트가 붙을 때마다 소켓을 열어주는 것이 주된 역할이다.
2) Socket(Client) : clientSocket = new Socket(서버IP, 서버Port);
* (위) 명령어가 클라이언트에서 서버로 요청하는 부분이며, 서버에서는 accept()가 감지한다.
3) ServerSocket : Socket socket = listener.accept();
- 서버에 클라이언트 접속이 감지되는 순간 서버는 소켓을 하나 만든다.
- 이 소켓은 내부적으로 포트와 연결되어 1:1로 클라이언트의 요청을 처리한다.
* 결국 소켓은 서버에서 만들어진 별도의 공간으로 소켓과 클라이언트가 다이렉트로 연결되어 처리한다.
4) Socket(Client) : clientSocket.getOutputStream();
- 클라이언트는 스트림을 적기위해서 OutputStream으로 서버에 날린다.
5) ServerSocket : socket.getInputStream();
- 서버에서는 클라이언트가 보낸 스트림을 InputStream으로 받는다.
- 이후로 서버도 클라이언트가 필요한 데이터를 OutputStream으로 보내고 클라이언트는 InputStream으로 받는다.
- 요청이 끝날 때까지 위 프로세스(클라이언트와 서버의 양방향통신)가 지속된다.
6) Socket(Client) : clientSocket.close();
- 클라이언트소켓 종료.
7) ServerSocket : socket.close();
- 서버소켓 종료.
3. 클라이언트 소켓의 클래스와 메소드


* Input, OutputStream에는 set이 없고 get만 사용한다.

1) Socket clientSocket = new Socket("128.12.1.1", 5550);
- 클라이언트가 128.12.1.1:5550 주소를 가진 서버에 접속하면, 서버는 소켓이 생성된다.
2) BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
- BufferedReader객체를 생성하여 소켓을 받을 준비를 한다.
3) BufferedWriter out = new BufferedWriter(new OutputStreamReader(clientSocket.getOutputStream()));
-BufferedWriter 객체를 생성하여 소켓을 보낼 준비를 한다.
* 받을 대상이 파일이냐 소켓이냐에 따라 방법이 다르다.
4) out.writer("hello"+"\n");
- 접속된 서버에 정보를 전달한다.
5) out.flush();
- 사용하는 이유는 Buffer는 일정량이 다 채워져야 Stream으로 보낼 수 있는데,
+ 만약 마지막에 다 채우지못하고 조금 남은 데이터가 있다면 flush로 다 보내버리는 것이다.
6) int x = in.read();
- 정수로 읽어온다.
7) String line = in.readline();
- 한줄씩 읽어온다.
4. 서버소켓의 클래스와 메소드



1) 생성자는 포트만 가지고 기다리고 있으면 된다.
- 대기하고 있다가 클라이언트가 포트로 접속하는 것만 감지하면 되기 때문에.
2) Socket accept();
- 클라이언트의 접근을 감지하자마자 소켓을 만든다.
3) 입출력 Stream
- 클라이언트의 입출력 스트림생성과 동일하다.