네트워크 망을 통해 서로 다른 컴퓨터 간에 데이터를 송수신하는 TCP/IP 소켓 네트워크 프로그래밍을 배웁니다.
1. 네트워크 용어 사전 (Glossary)
- IP Address: 네트워크 상에서 컴퓨터 장치를 식별하는 고유한 통신 주소입니다. (예: 192.168.0.1)
- Port Number: 한 컴퓨터 내부에서 구동 중인 수많은 네트워크 프로그램 중 특정 서비스를 구분하는 16-bit 번호입니다. (0~65535)
- TCP (Transmission Control Protocol): 연결 수립 과정을 거쳐 데이터 손실 없이 정확히 전달함을 보장하는 신뢰성 프로토콜입니다.
- ServerSocket: 클라이언트의 접속 요청을 특정 포트에서 대기(
accept())하는 서버 전용 소켓입니다.
2. TCP 멀티스레드 에코 서버 구현 예제
import java.io.*;
import java.net.*;
public class TcpEchoServer {
public static void main(String[] args) {
int port = 8888;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("서버가 " + port + " 포트에서 클라이언트 접속을 대기합니다...");
while (true) {
Socket socket = serverSocket.accept(); // 접속 승인
System.out.println("클라이언트 연결됨: " + socket.getInetAddress());
// 입출력 스트림 획득
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String clientMsg;
while ((clientMsg = reader.readLine()) != null) {
System.out.println("수신 메세지: " + clientMsg);
writer.println("Echo: " + clientMsg); // 에코 응답
}
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 자주 묻는 질문 (Q&A)
Q. TCP 통신에서 accept() 메소드는 왜 블로킹(Blocking)되나요?
A. 클라이언트가 new Socket(ip, port)로 실제 접속을 시도할 때까지 스레드가 대기 상태에 들어가기 때문입니다. 클라이언트가 연결되면 통신용 Socket 객체를 리턴하며 블로킹이 해제됩니다.