최원종의 개발 블로그

소켓(Socket) 본문

Java/JAVA 유용한 클래스

소켓(Socket)

chl6698 2026. 3. 26. 10:20

소켓 정의

프로그램 사이 연결을 위한 소프트웨어 인터페이스

두 프로그램이 네트워크로 데이터를 주고받기 위한 연결 끝점
[내 프로그램]                    [상대방 프로그램]
      |                                 |
   소켓 A   ────── 네트워크 ──────     소켓 B
      |                                 |
  (전화기)                           (전화기)

 

 

I/O단원과 소켓 단원 차이점

I/O 단원:
  [파일]              ── FileInputStream ──►  내 컴퓨터 [프로그램]
  내 컴퓨터 [프로그램] ── FileOutputStream ──► [파일]

소켓 단원:
  내 컴퓨터 [프로그램] ──소켓──► 네트워크 ──► 다른 컴퓨터 [프로그램]

I/O단원에서 파일 다룰 때

FileInputStream  fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");

int data = fis.read();   // 파일에서 읽기
fos.write(data);         // 파일에 쓰기

 

소켓이 파일 다룰 때

  • read()와 write()가 그대로이다.
  • 대상이 파일에서 네트워크로 바뀌었을 뿐, I/O 에서 배운 스트림 개념이 소켓에서도 똑같이 쓰인다.
Socket socket = new Socket("localhost", 5000);

InputStream  in  = socket.getInputStream();   // 상대방이 보낸 데이터 읽기
OutputStream out = socket.getOutputStream();  // 상대방에게 데이터 보내기

int data = in.read();   // 네트워크에서 읽기
out.write(data);        // 네트워크로 쓰기

 

파일 I/O  :  FileInputStream   ── read()  ──► 내 프로그램
             FileOutputStream  ◄── write() ── 내 프로그램

소켓 I/O  :  socket.getInputStream()   ── read()  ──► 내 프로그램
             socket.getOutputStream()  ◄── write() ── 내 프로그램

TCP vs UDP - 두 가지 방식

TCP (Transmission Control Protocol) - 신뢰성 우선
  - 연결을 먼저 맺고 데이터를 주고받음
  - 데이터가 순서대로, 빠짐없이 전달됨
  - 예시: 카카오톡 메시지, 파일 다운로드, 이메일

UDP (User Datagram Protocol) - 속도 우선
  - 연결 없이 바로 데이터를 전송
  - 일부 데이터가 빠지거나 순서가 바뀔 수 있음
  - 예시: 유튜브 라이브, 온라인 게임, 화상통화

 

TCP와 UDP가 필요한 이유

카카오톡 메시지가 중간에 잘리면?    → 큰일남  → TCP
유튜브 라이브가 0.1초 버벅거리면?  → 감수 가능 → UDP
파일 다운로드 중 일부가 손상되면?  → 큰일남  → TCP
온라인 게임 위치가 가끔 튀면?      → 감수 가능 → UDP

서버와 클라이언트

서버 (Server)
  - 먼저 켜놓고 기다리는 쪽
  - 특정 포트 번호에서 연결 요청을 기다림
  - 예시: 카카오톡 서버, 유튜브 서버

클라이언트 (Client)
  - 서버에 연결을 요청하는 쪽
  - 서버의 주소와 포트 번호를 알고 연결
  - 예시: 내 폰의 카카오톡 앱, 내 브라우저

 


포트 번호

컴퓨터 프로그램이 여러개 동시에 실행되고 있을 때 외부에서 데이터가 들어오면

어느 프로그램에 데이터를 줘야 하는지 구분하는 것

  • ex) 크롬, 카카오톡, 게임 실행 중 카톡이 오면 카톡에게 데이터를 주기 위해 포트번호가 존재함.
IP 주소   = 건물 주소 (어느 컴퓨터인지)
포트 번호 = 호실 번호 (그 컴퓨터의 어느 프로그램인지)

 

범위 이름 예시
0 ~ 1023 잘 알려진 포트 HTTP(80), HTTPS(443)
1024 ~ 49151 등록된 포트 애플리케이션용
49152 ~ 65535 동적/사설 포트 임시 사용

소켓 통신의 전체 흐름

서버                                      클라이언트
 |                                              |
 | 1. ServerSocket(5000) 생성                   |
 |    포트 5000 열고 대기                        |
 |                                              |
 | 2. accept() ─── 멈춤 ──────────────────────► |
 |    클라이언트가 올 때까지 기다림               |
 |                                              |
 |                           3. new Socket("localhost", 5000)
 |                              서버에 연결 요청  |
 |                                              |
 | 4. 연결 수락, Socket 반환 ◄─────────────────  |
 |                                              |
 | 5. 데이터 송수신 ◄───────────────────────────►|
 |                                              |
 | 6. close() 연결 종료                          |

 

 

서버에서 ServerSocket 과 Socket 이 모두 등장하는 이유

ServerSocket  = 문지기 역할 (포트를 열고 연결 요청만 기다림)
Socket        = 실제 통신 담당 (연결된 클라이언트와 데이터를 주고받음)

클라이언트가 연결하면 → ServerSocket 이 새 Socket 을 만들어서 반환
이후 ServerSocket 은 다음 연결을 기다리고, Socket 이 실제 통신을 맡음

 


요약정리

소켓
  - 두 프로그램이 네트워크로 데이터를 주고받는 연결 끝점
  - I/O 에서 배운 InputStream / OutputStream 이 그대로 사용됨

TCP vs UDP
  - TCP : 신뢰성 보장 → 채팅, 파일 전송
  - UDP : 속도 우선   → 게임, 라이브 스트리밍

포트 번호
  - IP 주소 = 컴퓨터 주소, 포트 번호 = 프로그램 주소

서버 vs 클라이언트
  - 서버 : ServerSocket(대기) + Socket(통신)
  - 클라이언트 : Socket 만 사용