JAVA
[Java] Socket, ServerSocket 클래스
배씌
2025. 3. 24. 11:31
자바에서는 소켓 프로그래밍을 할 때, 클라이언트와 서버 간의 연결을 위해 Socket 클래스와 ServerSocket 클래스를 사용한다.
1. Socket 클래스
주로 클라이언트가 서버에 연결하기 위해 사용하는 클래스이며, TCP 기반으로 동작한다.
Socket의 기본 동작 흐름
- 클라이언트가 Socket 객체를 생성하여 서버의 특정 IP 주소와 포트로 연결 요청
- 서버가 ServerSocket.accpet()를 호출하여 클라이언트 연결 수락
- 클라이언트와 서버가 데이터를 송수신
- 통신이 끝나면 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()를 호출하여 소켓을 닫고 리소스 해제