네트워크 통신의 시작: 소켓 프로그래밍

heeezni·2025년 6월 10일
post-thumbnail

소켓 프로그래밍

  • 소켓(Socket): 네트워크 상에서 데이터를 주고받기 위한 양 끝단(EndPoint)

  • 소켓 프로그래밍: 클라이언트-서버 간 통신을 소켓을 통해 구현하는 방식

✅ 장점: 복잡한 네트워크 세부 구현(패킷, 라우팅 등)을 몰라도, Socket 객체만으로 통신 구현 가능 (추상화됨)


단계별 네트워크 통신 수준

Lv.1 에코 프로그래밍(echo)

  • 서버에 말을 걸고, 그 말을 나에게 다시 돌아오게 하는 수준
  • 클라이언트 ↔ 서버 ↔ 클라이언트

Lv.2 유니캐스팅 (Unicasting)

  • 서버에 동시에 여러 명이 접속하여 각자 메아리를 구현하는 수준
    (서로는 대화 못 하고 서버와만 대화 가능)
  • 여러 클라이언트 ↔ 서버 ↔ 각 클라이언트

Lv.3 멀티캐스팅 (Multicasting)

  • 서버에 동시에 여러 명이 접속하여, 서로 대화를 할 수 있게 구현하는 수준
    (채팅방 구조)
  • 클라이언트 1 ↔ 서버 ↔ 클라이언트 2~N

소켓 비유

☎️ 소켓 == 종이컵 전화기

  • 네트워크로 통신하기 위해 만든 연결 도구
  • 클라이언트와 서버는 종이컵으로 연결되어 있어야 말이 오감
  • 연결된 후, 안쪽에서 실(스트림)을 뽑아 데이터를 주고받음

🧵 스트림 == 종이컵 안의 실 (데이터 통로)

  • 실제 메시지가 오가는 데이터의 길
  • InputStream / OutputStream: 실을 타고 오고가는 정보
[클라이언트]                             [서버]

📞 전화 걸기 (Socket 생성)            ───▶  📞 전화기 만들기 (ServerSocket 생성)
                                          ☎️ 전화 받기 (accept 호출)
🔗 연결 완료                         ◀───  🔗 연결 완료 → Socket 반환

🧵 실 연결 (getInput/OutputStream)   ◀──▶  🧵 실 연결 (getInput/OutputStream)

💬 데이터 송수신                      ◀──▶  💬 데이터 송수신

대응되는 Java 코드

✅ 서버측

// 전화기 만들기
ServerSocket server = new ServerSocket(포트번호(int));

// 전화 받기 (클라이언트 연결 수락)
Socket socket = server.accept();

// 실 뽑기 (받기용)
InputStream is = socket.getInputStream();
// 실 뽑기 (보내기용)
OutputStream os = socket.getOutputStream();     

✅ 클라이언트측

// 전화 걸기 (서버에 연결 요청)
Socket socket = new Socket("아이피 주소"(String), 포트번호(int));

// 실 뽑기 (받기용) + 스트림체이닝
BufferedWriter buffw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 실 뽑기 (보내기용) + 스트림체이닝
BufferedReader buffr = new BufferedReader(new InputStreamReader(socket.getInputStream()));

📎 관련: Stream과 3단계 스트림체이닝


ServerSocket과 클라이언트 연결의 원리

ServerSocket으로 서버를 먼저 열어놔야,
그 포트로 Socket 객체나 telnet이 접속할 수 있음

✅ telnet은 "테스트용 클라이언트"
서버를 먼저 실행해두면, cmd 창에서

telnet [IP] [포트]

명령어로 서버에 접속 시도할 수 있음

그러면 내 서버 코드의

Socket socket = server.accept();

이 부분이 깨어나면서 Socket이 반환됨

profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글