티스토리 뷰
Socket이란?
소켓(Socket)은 TCP/IP 기반 네트워크 통신에서 데이터 송수신의 마지막 접점입니다. 소켓 통신은 이러한 소켓을 이용하여 서버와 클라이언트 간의 데이터를 주고받는 양방향 연결 지향성 통신입니다. 보통 지속적으로 연결을 유지하면서 실시간으로 데이터를 주고받아야 하는 경우(게임, 채팅 등)에 사용됩니다.
소켓은 클라이언트 소켓과 서버 소켓으로 구분되며, 소켓간 통신을 위해서는 네트워크 상에서 클라이언트와 서버에 해당하는 컴퓨터를 식별하기 위해 IP주소와 컴퓨터 내에 현재 통신에 사용되는 응용프로그램을 식별하기 위한 포트 번호가 사용됩니다.
TCP Socket
- 양방향으로 바이트 스트림을 전송, 연결 지향성
- 오류 수정, 전송 처리, 흐름 제어 보장한다.
- 송신된 순서에 따라 중복되지 않게 데이터를 수신 -> 오버헤드 발생
- 소량의 데이터보다 대량의 데이터 전송에 적합 -> TCP 사용
- Socket과 ServerSocket으로 구현할 수 있다.
UDP Socket
- 비연결형 소켓
- 데이터의 크기에 제한이 있다.
- 확실하게 전달이 보장되지 않음, 데이터가 손실돼도 오류가 발생하지 않는다.
- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용한다.
- DatagramSocket, DatagramPacket, MulticastSocket로 구현할 수 있다.
Socket 흐름
Server Side
1. socket() 함수를 이용하여 소켓을 생성한다.
2. bind() 함수로 ip와 port 번호를 설정한다.
3. listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기시킬지 결정한다.
4. accept() 함수를 사용하여 클라이언트와의 연결을 기다린다.
Client Side
1. socket() 함수로 가장 먼저 socket을 연다.
2. connect() 함수를 이용하여 통신할 서버의 설정된 ip와 port 번호에 통신을 시도한다.
3. 통신을 시도 시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환한다.
4. 이를 통해 client와 서버가 서로 read(), write()를 하며 통신한다.
5. close()를 통해 연결을 종료한다.
WAS에서 Socket 직접 구현하기
기본적으로 TCP/IP 통신을 하기때문에 TCP Socket으로 구현했다.
public class WebServer {
private static final int DEFAULT_PORT = 8080;
public static void main(String args[]) throws Exception {
// 8080포트로 ServerSocket을 만든다.
try (ServerSocket listenSocket = new ServerSocket(8080)) {
Socket connection;
// connection이 생성되면 아래 반복문이 실행된다.
// request를 처리할 새로운 스레드를 만들어서 connection을 맡긴다.
while ((connection = listenSocket.accept()) != null) {
Thread thread = new Thread(new RequestHandler(connection));
thread.start();
}
}
}
}
try - with - resources
위의 코드에서 눈여겨봐야할 부분이 try( ... ) { .... }문입니다. 자바7부터 사용할 수 있는 문법인데 try()의 인자로 자원 객체를 전달하면 try 코드 블록이 끝나면 자동으로 자원을 종료해줍니다. 즉, 따로 finally 블록이나 모든 catch 블록에 종료 처리를 하지 않아도 됩니다. 단 close()가 호출되기 위해서는 객체가 아래와 같이 AutoCloseable을 implements 해야한다.
참고
'Java' 카테고리의 다른 글
[Java] orElse와 orElseGet의 차이 (0) | 2023.11.21 |
---|---|
[Java] JDBC 사용하기 (MySQL) (0) | 2023.01.26 |