JAVA

[Java] Socket, ServerSocket 클래스

배씌 2025. 3. 24. 11:31

자바에서는 소켓 프로그래밍을 할 때, 클라이언트와 서버 간의 연결을 위해 Socket 클래스와 ServerSocket 클래스를 사용한다.

 

1. Socket 클래스

주로 클라이언트가 서버에 연결하기 위해 사용하는 클래스이며, TCP 기반으로 동작한다.

 

Socket의 기본 동작 흐름

  1. 클라이언트가 Socket 객체를 생성하여 서버의 특정 IP 주소와 포트로 연결 요청
  2. 서버가 ServerSocket.accpet()를 호출하여 클라이언트 연결 수락
  3. 클라이언트와 서버가 데이터를 송수신
  4. 통신이 끝나면 close()를 호출하여 소켓 종료

1) Socket 객체 생성

Socket socket = new Socket("localhost", 12345);
  • "localhost" (127.0.0.1) : 자신의 컴퓨터를 가리킴, (IP 주소)
  • 12345 : 서버가 열어둔 포트 번호

서버에 정상적으로 연결되면 Socket 객체가 반환되며, 이후 InputStream, OutputStream 을 통해 데이터 송수신 가능


2) 입/출력 스트림을 이용해 서버와 데이터 송수신

InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();

 

주로 입력과 출력을 위해 사용되고, 아래와 같이 Scanner 나 BufferedReader 와 같이 사용하기도 한다.

// 입력 : 터미널에서 읽어오기, 출력 : 콘솔창에 출력
Scanner sc = new Scanner(socket.getInputStream());
String line = sc.nextLine();

System.out.println(line);


// 입력 : 콘솔 창에서 입력, 출력 : 서버 터미널 창에 출력
Scanner sc = new Scanner(System.in);
PrintStream socketOut = new PrintStream(socket.getOutputStream());

String line = sc.nextLine();
socket.out.println(line);

3) 소켓 닫기

socket.close();

 

소켓을 사용한 후에는 반드시 자원을 해제해야 한다.

 

따라서, 아래와 같이 try-with-resources 를 주로 사용한다.(자동 닫기)

try (Socket socket = new Socket("localhost", 12345);
     Scanner sc = new Scanner(socket.getInputStream());
     PrintStream socketOut = new PrintStream(socket.getOutputStream()) {
     
     socketOut.println("Hello, Server!");
     String line = sc.readLine();
     System.out.println("서버 응답: " + line);
 } catch(IOException e) {
 	e.printStackTrace();
}

 

Socket 클래스 주요 메서드

메서드 설명
Socket(String host, int port) 지정된 호스트와 포트로 소켓 생성
getInputStream() 서버로 부터 데이터 읽는 입력 스트림 반환
getOutputStream() 서버로 데이터 내보내는 출력 스트림 반환
getInetAddress() 서버의 IP 주소 반환
getPort() 서버의 포트 번호 반환
getLocalAddress() 클라이언트의 IP 주소 반환
getLocalPort() 클라이언트가 사용한 포트 번호 반환

 


2. ServerSocket 클래스

클라이언트의 연결을 기다리고 관리하는 서버용 소켓 클래스이다.

클라이언트가 연결을 요청하면 새로운 Socket 객체를 생성하여 클라이언트와의 통신을 수행함.

 

1) 서버 소켓 생성

ServerSocket serverSocket = new ServerSocket(12345);
  • 12345 : 서버가 클라이언트의 요청을 받을 포트 번호

2) 클라이언트의 연결을 대기하고, 연결이 오면 Socket 객체 생성

Socket clientSocket = serverSocket.accept();
  • accpet() : 블로킹 메서드로, 클라이언트가 요청할 때까지 대기한다.

 

3) 서버 소켓 닫기

serverSocket.close();

 

서버 소켓을 닫아, 더 이상 새로운 연결을 받지 않도록 한다.

 

ServerSocket 클래스 주요 메서드

메서드 설명
ServerSocket(int port) 지정된 포트에서 서버 소켓 생성
accpet() 클라이언트의 요청이 올 때까지 대기하다가, 요청이 오면 새로운 Socket 객체 반환
close() 서버 소켓을 닫고 자원 해제

Server - ServerSocket 간 통신 과정 정리

1. 서버 시작

  • ServerSocket 을 생성하고, accept() 를 호출하여 클라이언트의 요청을 대기

2. 클라이언트 연결 요청

  • Socket(host, port) 을 생성하여 서버에 연결 요청

3. 연결 수락

  • 서버는 accept()를 통해 연결을 받고, 새로운 Socket 객체 생성

4. 데이터 송수신

  • InputStream, OutputStream 을 통해 서버 - 클라이언트 간 데이터를 송수신

5. 연결 종료

  • close()를 호출하여 소켓을 닫고 리소스 해제