🧠 파이썬(Python)으로 배우는 소켓(Socket) 통신 기초 예제
서버와 클라이언트 간의 데이터 전송은 네트워크 프로그래밍의 핵심입니다.
이번 글에서는 파이썬을 이용해 TCP 소켓 통신을 직접 구현해보며, 네트워크의 기본 원리를 이해해보겠습니다.
복잡한 라이브러리나 프레임워크 없이, 기본 socket 모듈만으로 간단한 서버와 클라이언트를 만들어볼 거예요.
🔍 소켓(Socket)이란?
‘소켓(Socket)’이란 네트워크 상에서 데이터를 주고받기 위한 통신 창구를 의미합니다.
쉽게 말해, 두 프로그램이 서로 대화할 수 있는 통로라고 생각하면 됩니다.
예를 들어, 웹브라우저(클라이언트)가 서버에 요청을 보내고 HTML 데이터를 받는 것도 일종의 소켓 통신입니다.
소켓 통신은 크게 두 가지 방식으로 나뉩니다:
- TCP (Transmission Control Protocol): 연결 기반, 신뢰성 보장, 순서 보장
- UDP (User Datagram Protocol): 비연결형, 빠르지만 신뢰성 낮음
이번 예제에서는 데이터 손실이 없고 안정적인 TCP 방식을 사용합니다.
⚙️ 파이썬 소켓 서버(server.py) 만들기
아래는 가장 기본적인 TCP 서버 코드입니다.
클라이언트가 접속하면 문자열을 받아서 그대로 되돌려주는 구조입니다.
import socket
HOST = '127.0.0.1' # 서버 IP 주소
PORT = 5000 # 포트 번호
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen()
print(f"서버 시작! 클라이언트 접속 대기 중... (PORT: {PORT})")
client_socket, addr = server_socket.accept()
print(f"클라이언트 접속됨: {addr}")
while True:
data = client_socket.recv(1024).decode()
if not data:
break
print(f"클라이언트: {data}")
response = f"서버가 받음: {data}"
client_socket.send(response.encode())
client_socket.close()
server_socket.close()
이 코드는 다음 순서로 동작합니다:
- 소켓 생성 (
socket.socket) - IP와 포트 바인딩 (
bind) - 클라이언트 접속 대기 (
listen/accept) - 메시지 수신 (
recv) 및 응답 (send) - 연결 종료 (
close)
💻 클라이언트(client.py) 만들기
서버와 통신할 클라이언트 프로그램은 다음과 같습니다.
import socket
HOST = '127.0.0.1'
PORT = 5000
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))
print(f"서버({HOST}:{PORT})에 연결됨")
while True:
message = input("보낼 메시지 입력 (exit 입력 시 종료): ")
if message.lower() == 'exit':
break
client_socket.send(message.encode())
data = client_socket.recv(1024).decode()
print(f"서버 응답: {data}")
client_socket.close()
print("클라이언트 종료")
이제 두 파일을 각각 server.py, client.py로 저장하고,
터미널 두 개를 열어 서버를 먼저 실행한 뒤 클라이언트를 실행하면 됩니다.
🧩 실행 예시
서버 콘솔
서버 시작! 클라이언트 접속 대기 중... (PORT: 5000)
클라이언트 접속됨: ('127.0.0.1', 52344)
클라이언트: 안녕하세요
클라이언트: 테스트 메시지
클라이언트 콘솔
서버(127.0.0.1:5000)에 연결됨
보낼 메시지 입력 (exit 입력 시 종료): 안녕하세요
서버 응답: 서버가 받음: 안녕하세요
보낼 메시지 입력 (exit 입력 시 종료): 테스트 메시지
서버 응답: 서버가 받음: 테스트 메시지
이처럼 클라이언트가 전송한 메시지를 서버가 받아서 처리하고, 응답을 돌려주는 간단한 양방향 통신이 구현됩니다.
🚀 응용하기
이 예제는 가장 기본적인 구조이지만, 아래처럼 확장할 수 있습니다:
- 여러 클라이언트 동시 접속 처리 (스레드나 asyncio 사용)
- UDP 통신 방식으로 변경
- 채팅 프로그램, 원격 제어, IoT 장비 통신 등에 응용
- 서버 응답을 JSON 포맷으로 만들어 데이터 구조 전송
실제 업무용 시스템이나 IoT 디바이스 제어에서도 이런 형태의 TCP 통신이 많이 활용됩니다.
특히 서버-클라이언트 구조를 이해하면 REST API나 MQTT 같은 고수준 프로토콜도 쉽게 이해할 수 있습니다.
📝 마무리
이번 글에서는 파이썬의 socket 모듈을 이용해
TCP 기반의 간단한 서버와 클라이언트를 구현해봤습니다.
이 예제 하나만 제대로 이해해도,
네트워크의 핵심 개념인 IP, 포트, 연결, 송수신, 종료의 흐름을 감 잡을 수 있습니다.
다음 단계로는 멀티 클라이언트 처리나 **비동기 통신(asyncio)**에 도전해보세요.
파이썬의 강력한 네트워킹 기능을 활용하면,
웹 서버, 채팅 서버, IoT 통신까지 직접 만들 수 있습니다. 🚀
