[Java] Chapter 19. 네트워크 입출력

SeungWoo Cha·2025년 9월 17일

[Java] 이것이 자바다

목록 보기
17/17
post-thumbnail

Chapter 19. 네트워크 입출력

19.1. 네트워크 기초

1) 네트워크, LAN, WAN

  • 네트워크: 여러 컴퓨터를 통신 회선으로 연결한 것
  • LAN(Local Area Network): 특정 영역(가정, 회사, 건물 등)에 존재하는 컴퓨터 연결
  • WAN(Wide Area Network): 여러 LAN을 연결한 것

2) 서버와 클라이언트

  • 서버(Server): 서비스를 제공하는 프로그램
  • 클라이언트(Client): 서비스를 요청하는 프로그램

3) IP 주소

  • 컴퓨터(네트워크 어댑터)의 고유 주소
  • 프로그램은 DNS를 통해 도메인 이름을 IP로 변환 후 통신
  • 예: 웹 브라우저는 클라이언트로서 DNS에서 IP 조회 후 웹 서버와 통신

4) Port 번호

  • 하나의 컴퓨터(IP)에서 여러 서버 프로그램을 구분하기 위해 사용
  • 서버는 Port 번호에 바인딩, 클라이언트는 OS가 부여한 동적 포트를 사용
Port 범위용도
0 ~ 1023ICANN 예약(HTTP: 80, HTTPS: 443 등)
1024 ~ 49151등록 가능한 Port(기업/서비스)
49152 ~ 65535동적/개인용 포트(OS 자동 할당)

19.2. IP 주소 얻기

자바에서는 java.net.InetAddress 클래스를 사용.

// 로컬 IP 주소 얻기
InetAddress local = InetAddress.getLocalHost();
System.out.println(local.getHostAddress());

// 도메인으로 IP 얻기
InetAddress naver = InetAddress.getByName("www.naver.com");
System.out.println(naver.getHostAddress());

// 하나의 도메인에 여러 IP 등록된 경우
InetAddress[] iaArr = InetAddress.getAllByName("www.google.com");
for (InetAddress ip : iaArr) {
    System.out.println(ip.getHostAddress());
}

19.3. TCP 네트워킹

1) TCP 특징

  • 연결형 프로토콜 → 송수신자가 연결된 상태에서 통신
  • 데이터가 순서대로 전달되고 손실 없음
  • 흔히 TCP/IP라고 부름

2) 자바 TCP 클래스

  • ServerSocket: 서버에서 클라이언트 연결 수락
  • Socket: 클라이언트 연결 요청 및 양방향 통신

3) TCP 서버 예제

import java.net.*;
import java.io.*;

public class TcpServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(50001)) {
            System.out.println("[서버] 시작됨");

            Socket socket = serverSocket.accept(); // 연결 대기
            InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
            System.out.println("[서버] 연결됨: " + isa.getHostName());

            // 데이터 수신
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            String message = dis.readUTF();
            System.out.println("[서버] 받은 메시지: " + message);

            // 데이터 전송
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            dos.writeUTF("Hello Client");
            dos.flush();

            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4) TCP 클라이언트 예제

import java.net.*;
import java.io.*;

public class TcpClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 50001)) {
            System.out.println("[클라이언트] 연결 성공");

            // 데이터 전송
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            dos.writeUTF("Hello Server");
            dos.flush();

            // 데이터 수신
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            String response = dis.readUTF();
            System.out.println("[클라이언트] 받은 메시지: " + response);

        } catch (UnknownHostException e) {
            System.out.println("잘못된 IP 주소");
        } catch (IOException e) {
            System.out.println("연결 실패");
        }
    }
}

5) 전체 과정 요약 (TCP)

  • 서버

    1. ServerSocket 생성 및 포트 바인딩
    2. accept()로 클라이언트 요청 수락
    3. Socket 통해 데이터 송수신
    4. close()로 연결 종료
  • 클라이언트

    1. Socket 생성 (서버 IP + Port)
    2. 서버 연결 요청
    3. Socket 통해 데이터 송수신
    4. close()로 연결 종료

19.4. UDP 네트워킹

특징

  • 비연결형 프로토콜 → 연결 과정 없음
  • 속도는 빠르지만 순서 보장 안 되고 손실 가능성 있음
  • 게임, 동영상 스트리밍 등 실시간성이 중요한 곳에서 사용

자바 UDP 클래스

  • DatagramSocket: 송수신에 사용
  • DatagramPacket: 전송할 데이터 캡슐화

UDP 예제

// UDP 서버
import java.net.*;

public class UdpServer {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(50001);
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        
        System.out.println("[서버] 수신 대기");
        socket.receive(packet);
        
        String msg = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
        System.out.println("[서버] 받은 메시지: " + msg);
        
        socket.close();
    }
}

// UDP 클라이언트
import java.net.*;

public class UdpClient {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        byte[] buf = "Hello UDP".getBytes("UTF-8");
        
        DatagramPacket packet = new DatagramPacket(
            buf, buf.length, new InetSocketAddress("localhost", 50001));
        
        socket.send(packet);
        socket.close();
    }
}

  • TCP: 연결형, 신뢰성 보장, 순서 유지 → ServerSocket, Socket
  • UDP: 비연결형, 속도 우선, 손실 가능 → DatagramSocket, DatagramPacket
  • IP 주소: 네트워크 어댑터 단위 고유 주소 (DNS로 변환 가능)
  • Port 번호: 하나의 IP에서 여러 서버 프로그램 구분

profile
한 발자국씩

0개의 댓글