2. 소켓(Socket)

박은서's avatar
Feb 09, 2026
2. 소켓(Socket)

1. 소켓(Socket)

1️⃣ 소켓이란?

네트워크에서 두 프로그램이 데이터를 주고받기 위한 통신 창구(출입구)

2️⃣ 비유

📞 소켓 = 전화기
  • IP 주소 → 전화번호
  • 포트 번호 → 내선 번호
  • 소켓 → 실제로 통화하는 전화기
[프로그램] ── 소켓 ── 네트워크 ── 소켓 ──[프로그램]

3️⃣ 소켓이 하는 일

  • 연결 생성
  • 데이터 송수신
  • 연결 종료

4️⃣ 소켓의 구성 요소

  • IP 주소
  • 포트 번호
  • 프로토콜 (TCP / UDP)
  • 상태 정보

5️⃣ TCP 소켓 vs UDP 소켓

1) TCP 소켓 (신뢰성 ⭕)

  • 연결 지향 (3-way handshake)
  • 데이터 순서 보장
  • 손실 시 재전송
  • 예: HTTP, HTTPS, FTP

2) UDP 소켓 (속도 ⭕)

  • 비연결
  • 손실 가능
  • 빠름
  • 예: 게임, 스트리밍, DNS

6️⃣ 예시

1) 서버 측

ServerSocketserver=newServerSocket(8080); Socketsocket= server.accept();

2) 클라이언트 측

Socketsocket=newSocket("localhost",8080);

7️⃣ 실습

1) Server

package com.mtcoding.ex03; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) throws IOException { // 1. 리스너 ServerSocket ss = new ServerSocket(20000); // 2. 소켓 System.out.println("[server] waiting"); Socket socket = ss.accept(); System.out.println("[server] connected"); // 3. 버퍼 InputStream in = socket.getInputStream(); InputStreamReader ir = new InputStreamReader(in); BufferedReader br = new BufferedReader(ir); String msg = br.readLine(); System.out.println("클라이언트로부터 받은 메시지 : " + msg); } }

2) Client

package com.mtcoding.ex03; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class MyClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 20000); OutputStream out = socket.getOutputStream(); OutputStreamWriter ow = new OutputStreamWriter(out); BufferedWriter bw = new BufferedWriter(ow); bw.write("hello world"); bw.write("\n"); bw.flush(); } }

3) 결과

notion image

2. 서버 소켓(ServerSocket)

1️⃣ 서버 소켓이란?

  • 서버 프로그램이 클라이언트의 접속을 기다리기 위해 사용하는 소켓
  • 접속을 받아들이는 전용 역할
  • ServerSocket은 특정 포트를 열고 클라이언트의 연결 요청을 대기·수락하는 객체(리스너)

2️⃣ ServerSocket이 필요한 이유

  • 서버는 항상 켜져 있어야 함
  • 누가 언제 접속할지 모름
  • 그래서 연결 요청을 계속 기다리는 전용 객체가 필요
➡️ 그 역할이 ServerSocket

3️⃣ 소켓과의 관계

ServerSocket → 연결 수락 전용 Socket → 실제 데이터 통신
ServerSocket통신 안 함
accept() 후 생긴 Socket통신 담당

4️⃣ 동작 흐름

[클라이언트] ↓ 접속 요청 [ServerSocket] --accept() -->[Socket] ↓ 데이터 송수신

5️⃣ 예시

1) 서버

ServerSocketserverSocket=newServerSocket(8080); System.out.println("서버 대기 중..."); Socketsocket= serverSocket.accept();// 여기서 대기 System.out.println("클라이언트 연결됨");

2) 클라이언트

Socketsocket=newSocket("localhost",8080);

6️⃣ 필기

notion image

7️⃣ 특징 정리

항목
ServerSocket
역할
클라이언트 접속 대기
포트
하나의 포트에 바인딩
통신
❌ 안 함
반환값
accept()Socket
멀티 접속
가능 (반복 + 스레드)

3. 세션(Session)

1️⃣ 세션이란?

클라이언트와 서버 사이에서 일정 기간 유지되는 연결 상태 및 그에 관련된 정보
누가 접속했고, 지금 어떤 상태인지 서버가 기억하는 단위

2️⃣ 비유

☕ 카페 비유
  • 손님 입장 → 연결
  • 주문 정보 기억 → 세션
  • 나가기 → 세션 종료
손님 = 클라이언트 카운터 = 서버 주문서 = 세션 정보

3️⃣ 소켓 vs 세션 차이

구분
소켓(Socket)
세션(Session)
개념
통신 통로
상태 정보
성격
물리적/기술적
논리적
목적
데이터 송수신
상태 유지
종료
연결 끊기
타임아웃/로그아웃
➡️ 소켓 위에서 세션이 관리됨

4️⃣ 세션이 필요한 이유

네트워크 통신(특히 HTTP)은 기본적으로 무상태(stateless)
❌ 요청 1번 → 응답 → 끝
❌ 누가 요청했는지 기억 못 함
그래서 필요:
  • 로그인 유지
  • 장바구니
  • 사용자 권한
  • 게임 상태
➡️ 이걸 묶어주는 게 세션

5️⃣ 세션의 구성 요소

  • 세션 ID
  • 사용자 ID
  • 로그인 여부
  • 마지막 접근 시간
  • 기타 상태 데이터
 

4. 필기 정리

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
 
Share article