자바 기반 네트워크 통신 프로그래밍 입문

네트워크 프로그래밍의 기본 개념

네트워크 프로그래밍은 서로 다른 장치 간에 데이터를 주고받는 소프트웨어 기술을 의미합니다. 이를 구현하기 위해 반드시 이해해야 할 세 가지 핵심 요소가 있습니다: IP 주소, 포트 번호, 그리고 통신 프로토콜입니다.

IP 주소

IP 주소는 네트워크 상에서 각 장치를 고유하게 식별하는 번호입니다. IPv4는 4개의 8비트 숫자로 구성되며, 각 부분은 0~255 사이의 값을 가집니다 (예: 192.168.1.1). 반면 IPv6는 128비트 주소 체계를 사용하여 훨씬 더 많은 주소 공간을 제공합니다.

포트 번호

포트는 하나의 장비 내에서 실행 중인 특정 애플리케이션 또는 프로세스를 식별하는 데 사용됩니다. 포트 번호는 0부터 65535까지의 정수 값이며, 일반적으로 0~1023번 포트는 시스템 예약 포트이므로 사용자 애플리케이션은 1024 이상의 포트를 사용하는 것이 안전합니다.

통신 프로토콜

데이터 전송 방식과 형식을 규정한 규칙으로, 주로 UDP와 TCP가 사용됩니다. IP 주소로 목적지 장치를 찾고, 포트 번호로 해당 장치 내의 프로세스를 지정하며, 프로토콜로 데이터 전송 방식을 결정합니다.

InetAddress 클래스 활용

자바에서는 InetAddress 클래스를 통해 IP 주소 정보를 다룰 수 있습니다.

  • InetAddress.getLocalHost(): 로컬 머신의 IP 주소를 가져옵니다.
  • InetAddress.getByName(String host): 호스트 이름이나 IP 문자열로부터 InetAddress 객체를 생성합니다.
  • getHostName(): 해당 IP의 호스트 이름을 반환합니다.
  • getHostAddress(): IP 주소 문자열을 반환합니다.

UDP 통신 방식

UDP(User Datagram Protocol)는 연결 없이 데이터를 전송하는 경량 프로토콜입니다.

특징

  • 연결 설정이 필요 없음
  • 데이터 손실 가능성이 있음 (신뢰성 낮음)
  • 패킷 단위로 전송되며, 최대 크기는 64KB 이하
  • 빠른 전송 속도로 실시간 응용에 적합

주요 사용 사례

채팅 앱, 화상 회의, 온라인 게임 등 실시간성이 중요한 서비스에서 자주 사용됩니다.

핵심 클래스

DatagramPacket: 전송할 데이터를 담는 패킷 객체입니다.

DatagramPacket(byte[] data, int length, InetAddress address, int port) // 전송용
DatagramPacket(byte[] data, int length) // 수신용

DatagramSocket: 패킷을 보내고 받는 통로 역할을 합니다.

void send(DatagramPacket packet)
void receive(DatagramPacket packet)
void close()

TCP 통신 방식

TCP(Transmission Control Protocol)는 신뢰성 있는 연결 기반 통신을 제공합니다.

특징

  • 연결 지향형 – 데이터 전송 전에 연결 수립
  • 3-way handshake로 연결 시작, 4-way wave로 종료
  • 데이터 전송 크기에 제한 없음
  • 입출력 스트림 기반으로 안정적인 전송 보장
  • UDP보다 느리지만 신뢰성 높음

주요 사용 사례

파일 전송, 이메일, 원격 접속 등 정확한 데이터 전달이 필요한 경우에 적합합니다.

핵심 클래스

Socket: 클라이언트 측 연결을 나타냅니다.

Socket(String host, int port) // 서버에 연결 시도
InputStream getInputStream()
OutputStream getOutputStream()
void close()

ServerSocket: 서버에서 클라이언트의 연결 요청을 대기합니다.

ServerSocket(int port)
Socket accept() // 클라이언트 연결 수락 (블로킹 호출)

TCP 통신 절차

클라이언트 동작 순서

  1. Socket 객체 생성 및 서버 연결
  2. getOutputStream()으로 출력 스트림 확보
  3. write() 메서드로 서버에 데이터 전송
  4. getInputStream()으로 입력 스트림 확보
  5. read() 메서드로 서버 응답 수신
  6. close()로 연결 종료

서버 동작 순서

  1. ServerSocket 생성 후 포트 바인딩
  2. accept() 호출로 클라이언트 연결 대기
  3. 수신된 Socket 객체로 getInputStream() 호출
  4. read()로 클라이언트 데이터 수신
  5. getOutputStream()으로 응답용 출력 스트림 확보
  6. write()로 클라이언트에 응답 전송
  7. Socket.close()로 연결 해제

태그: java 네트워크 프로그래밍 TCP/IP UDP socket

7월 18일 19:10에 게시됨