[Network] 소켓 프로그래밍 개념 정리-2025-01-24
소켓 프로그래밍 개념 정리
1. 소켓(Socket)
- 네트워크 상에서 데이터를 주고받기 위해 사용하는 양방향 통신 인터페이스
- Python에서 소켓은
socket 모듈을 사용하여 생성 및 제어
- 두 가지 주요 유형:
SOCK_STREAM: TCP(신뢰성 있는 연결 기반 통신)
SOCK_DGRAM: UDP(비연결 기반 통신, 속도가 빠름)
2. 서버 소켓과 클라이언트 소켓
- 서버 소켓: 클라이언트의 연결 요청을 수락하고 통신을 처리
socket() 생성
bind()로 IP와 포트 연결
listen()으로 클라이언트의 요청 대기
accept()로 클라이언트 요청 수락
- 클라이언트 소켓: 서버에 연결 요청을 보내고 통신을 수행
socket() 생성
connect()로 서버에 연결
3. IP와 포트 번호
- IP: 네트워크 상의 컴퓨터를 식별하는 주소
localhost 또는 127.0.0.1은 본인 컴퓨터를 의미
- 포트 번호: 특정 애플리케이션(프로그램)을 식별하는 번호
4. 데이터 송수신
- 소켓 간 데이터 전송과 수신은 바이트(bytes) 단위로 이루어짐
- 주요 함수:
send() / sendall(): 데이터를 송신
sendall(): 데이터가 모두 전송될 때까지 보장
recv(buffer_size): 데이터를 수신
5. TCP 연결 과정
- 서버:
- 소켓 생성 (
socket())
- IP와 포트 바인딩 (
bind())
- 연결 대기 (
listen())
- 클라이언트 요청 수락 (
accept())
- 클라이언트:
- 소켓 생성 (
socket())
- 서버에 연결 요청 (
connect())
6. 반복 처리와 실시간 통신
while 루프로 클라이언트와 서버가 계속 데이터를 송수신
- 실시간 통신에서는 데이터가 주고받아질 때까지 프로그램이 대기
7. 소켓 옵션
setsockopt(): 소켓 동작을 커스터마이즈
SO_REUSEADDR: 포트를 닫은 직후 재사용 가능하도록 설정
8. 에러 처리
- 소켓 연결은 네트워크 상태에 따라 오류가 발생할 수 있으므로 예외 처리(try-except)를 활용하는 것이 좋음
9. 서버와 클라이언트의 역할 차이
- 서버: 연결 요청을 기다리고 응답
- 클라이언트: 요청을 보내고 서버로부터 응답을 받음
10. 주요 코드 흐름
- 서버:
socket() → bind() → listen() → accept()
- 클라이언트와 데이터 송수신 (
recv(), sendall())
- 클라이언트:
socket() → connect()
- 데이터 송수신 (
sendall(), recv())
11. 네트워크 통신에서 데이터 인코딩/디코딩
- 인코딩: 데이터를
str에서 bytes로 변환 (ex: .encode('utf-8'))
- 디코딩: 데이터를
bytes에서 str로 변환 (ex: .decode('utf-8'))
12. 멀티 클라이언트 처리
- 현재 코드에서는 단일 클라이언트만 처리
- 여러 클라이언트와 동시에 통신하려면 스레드(Thread) 또는 비동기 프로그래밍 사용 필요