Language/JAVA

[이것이 자바다].ch18.네트워크 입출력

JSJH._. 2026. 1. 2. 16:07

[이것이 자바다] 18. 네트워크 입출력

안녕하세요. 이번에는 자바의 네트워크 입출력에 대해 정리한 내용입니다. 네트워크를 쓸때 꼭 필요한 기본적인 지식입니다. 여기나오는 내용을 외우지 않고 자바가 네트워크 입출력을 처리하는 방식을 알아두기만 해도 큰 도움이 될거 같습니다.


1. 네트워크 기초

  • IP 주소: 네트워크 상에서 컴퓨터(Host)를 식별하는 주소입니다. (192.168.0.1 등)
  • 포트(Port): 한 컴퓨터 내에서 실행 중인 프로그램을 구분하는 번호입니다. (8080, 3306 등)
  • 프로토콜(Protocol): 통신 규약입니다.
    • TCP: 연결 지향, 신뢰성 보장 (느림) -> 전화
    • UDP: 비연결 지향, 신뢰성 낮음 (빠름) -> 편지/방송

2. 자바 네트워킹 클래스

InetAddress

  • IP 주소를 다루는 클래스입니다.
  • getLocalHost(): 내 PC IP 확인
  • getByName("도메인"): 도메인 이름으로 IP 확인

TCP 통신 (Socket)

TCP는 연결을 먼저 맺고 데이터를 주고받습니다.

  1. 서버 (ServerSocket)
    • 포트를 열고 클라이언트의 연결을 기다립니다 (accept()).
  2. 클라이언트 (Socket)
    • 서버의 IP와 포트로 연결을 시도합니다.
  3. 데이터 입출력
    • 연결이 되면 Socket 객체의 InputStream, OutputStream을 통해 데이터를 주고받습니다.

UDP 통신 (Datagram)

UDP는 연결 없이 패킷(Packet) 단위로 데이터를 던집니다.

  • DatagramSocket: 우체통 역할
  • DatagramPacket: 편지(데이터+수신자주소) 역할

3. TCP 채팅 서버 예제 흐름

간단한 에코 서버(Echo Server) 구조입니다.

서버 (Server)

ServerSocket serverSocket = new ServerSocket(5001); // 1. 포트 열기

while(true) {
    // 2. 연결 수락 (클라이언트 올 때까지 대기)
    Socket socket = serverSocket.accept(); 

    // 3. 스트림 얻기
    InputStream is = socket.getInputStream();
    DataInputStream dis = new DataInputStream(is);

    // 4. 데이터 받기
    String message = dis.readUTF();
    System.out.println("받은 메시지: " + message);

    socket.close();
}

클라이언트 (Client)

// 1. 서버 접속
Socket socket = new Socket("localhost", 5001);

// 2. 스트림 얻기
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);

// 3. 데이터 보내기
dos.writeUTF("Hello Server!");

socket.close();

4. Java NIO (New I/O)

  • 기존 IO(블로킹) 방식의 한계를 극복하기 위해 나온 고성능 네트워킹 방식입니다.
  • 채널(Channel), 버퍼(Buffer), 셀렉터(Selector)를 사용합니다.
  • 넌블로킹(Non-blocking) 방식을 지원하여, 적은 수의 스레드로 수많은 클라이언트 연결을 효율적으로 처리할 수 있습니다.

핵심 포인트

  • 네트워크 통신의 핵심은 IP(주소)와 Port(문)를 찾아가서 연결하는 것입니다.
  • TCPSocket을 사용해 연결 후 스트림으로 통신합니다. (안정성 중요)
  • UDPDatagram을 사용해 소포 던지듯이 통신합니다. (속도/실시간성 중요)

ch18을 끝으로 '이것이 자바다' 책은 마무리 되었습니다. 자바의 기초부터 여러 클래스들을 사용하는것을 지나 백엔드 맛보기까지 긴 과정을 따라가며 정리해 보았습니다. 저도 확실하게 이해못하거나 헷갈리는 부분도 있어서 정리한 내용을 계속 다시보며 배워나갈것 같습니다.
끝까지 읽어 주셔서 감사합니다.