파이썬 소켓 프로그래밍 TCP 에코 서버 클라이언트 50줄 구현 예제
⚡ 단 50줄로 배우는 TCP 에코 서버 클라이언트 실전 코드 공개
네트워크 프로그래밍을 처음 접하는 사람들에게 가장 많이 소개되는 예제가 바로 에코 서버와 클라이언트입니다.
특히 파이썬은 직관적인 문법과 강력한 표준 라이브러리를 제공하기 때문에, 소켓 프로그래밍을 배우기에 좋은 언어로 꼽히죠.
실제 서버와 클라이언트가 데이터를 주고받는 과정을 단순화해 보여주는 TCP 에코 서버는 복잡한 네트워크 이론을 몰라도 바로 실행해볼 수 있다는 장점이 있습니다.
단 몇 줄의 코드만으로 서버와 클라이언트가 연결되고, 메시지를 보내고 다시 돌려받는 과정을 눈으로 확인할 수 있다는 건 큰 매력이죠.
이번 글에서는 파이썬 소켓 모듈을 활용해 블로킹 방식으로 동작하는 TCP 에코 서버와 클라이언트를 단 50줄 이내 코드로 구현하는 방법을 다룹니다.
단순히 코드만 나열하는 것이 아니라, 소켓 프로그래밍의 핵심 개념과 실제 동작 방식까지 이해할 수 있도록 설명할 예정입니다.
이 과정을 따라가다 보면 자연스럽게 네트워크 기초 구조와 데이터 송수신 과정까지 익힐 수 있어, 다른 네트워크 애플리케이션 개발에도 큰 도움이 될 거예요.
📋 목차
🔗 소켓 프로그래밍 기본 개념
네트워크를 통해 데이터를 주고받으려면 두 컴퓨터가 서로 연결될 수 있는 통로가 필요합니다.
이 통로 역할을 하는 것이 바로 소켓(Socket)입니다.
소켓은 운영체제가 제공하는 네트워크 인터페이스로, 프로그램이 데이터를 전송하거나 수신할 수 있도록 연결 지점을 만들어 줍니다.
소켓은 크게 두 가지 방식으로 나눌 수 있습니다.
바로 TCP와 UDP입니다.
TCP는 연결 지향적이며 신뢰성을 보장하는 프로토콜로, 데이터 손실 없이 순서대로 안전하게 전달합니다.
반면 UDP는 비연결성 방식으로 빠른 속도를 장점으로 하지만 신뢰성은 보장되지 않습니다.
우리가 만들 에코 서버는 안정적인 데이터 전송을 위해 TCP 방식을 활용합니다.
📡 서버와 클라이언트의 관계
서버는 클라이언트의 요청을 받아 처리하는 역할을 합니다.
예를 들어 채팅 프로그램을 생각해보면, 서버는 중앙에서 메시지를 받아 다른 클라이언트로 전달합니다.
반대로 클라이언트는 서버에 연결해 데이터를 요청하거나 전송하는 역할을 하죠.
TCP 에코 서버의 경우 동작 원리는 간단합니다.
클라이언트가 보낸 데이터를 서버가 그대로 다시 돌려주는 방식입니다.
이 단순한 구조 덕분에 네트워크 프로그래밍을 처음 배우는 사람들이 많이 활용하는 기본 예제가 된 것이죠.
- 🖥️서버는 연결을 대기하며 요청을 처리한다
- 📲클라이언트는 서버에 연결해 데이터를 전송한다
- 🔁에코 서버는 받은 데이터를 그대로 반환한다
즉, 소켓 프로그래밍은 단순히 데이터를 주고받는 도구 이상의 의미를 가지고 있습니다.
웹 서버, 메신저, 게임 서버 등 우리가 자주 사용하는 다양한 서비스의 핵심이 바로 소켓 기반 통신이라는 점을 이해하면, 이 기초 예제가 왜 중요한지 자연스럽게 와 닿을 것입니다.
🛠️ TCP 에코 서버 동작 원리
TCP 에코 서버는 클라이언트가 보낸 데이터를 그대로 되돌려주는 구조를 가지고 있습니다.
이 간단한 흐름을 통해 TCP의 연결 과정과 데이터 송수신 절차를 쉽게 이해할 수 있습니다.
서버는 항상 대기 상태로 있으며, 클라이언트가 접속하면 연결을 수락하고 데이터를 처리합니다.
🔄 TCP 연결 절차 (3-way handshake)
TCP는 신뢰성 있는 전송을 위해 3-way handshake라는 연결 절차를 사용합니다.
먼저 클라이언트가 서버로 연결 요청을 보내고(SYN), 서버가 이를 수락하며 응답(SYN-ACK)합니다.
마지막으로 클라이언트가 확인 응답(ACK)을 보내면 정식 연결이 맺어집니다.
이 과정을 거쳐야 데이터 전송이 가능한 상태가 되죠.
📩 에코 서버 데이터 흐름
연결이 성립하면 클라이언트는 데이터를 서버로 전송합니다.
서버는 해당 데이터를 읽어들인 뒤, 특별한 가공 없이 다시 클라이언트로 돌려보냅니다.
클라이언트는 자신이 보낸 데이터와 동일한 응답을 받게 되며, 이를 통해 통신이 정상적으로 이루어졌는지 확인할 수 있습니다.
| 단계 | 설명 |
|---|---|
| 1. 연결 요청 | 클라이언트가 서버에 접속 요청을 보냄 (SYN) |
| 2. 연결 수락 | 서버가 요청을 수락하고 응답 (SYN-ACK) |
| 3. 연결 완료 | 클라이언트가 ACK를 보내 연결 성립 |
| 4. 데이터 송수신 | 클라이언트 → 서버 데이터 전송, 서버 → 클라이언트 에코 응답 |
💡 TIP: 에코 서버는 단순해 보이지만, 실제로는 다양한 네트워크 실습에서 활용됩니다.
TCP의 기본 구조와 동작을 익히는 데 가장 좋은 예제이므로, 반드시 직접 실행해보는 것을 추천합니다.
⚙️ 클라이언트 구현 방법
클라이언트는 서버와의 연결을 요청하고, 사용자가 입력한 데이터를 서버로 전송한 뒤 서버가 되돌려주는 응답을 출력하는 역할을 합니다.
TCP 에코 클라이언트의 핵심은 연결(connect), 데이터 송신(send), 데이터 수신(recv) 세 단계로 정리할 수 있습니다.
💻 클라이언트 코드 구조
클라이언트 프로그램은 일반적으로 다음과 같은 흐름으로 작성됩니다.
- 🔌소켓 생성 (socket())
- 📡서버에 연결 요청 (connect())
- ✉️사용자 입력 데이터를 서버에 전송 (send())
- 📥서버로부터 응답 수신 (recv())
- ❌연결 종료 (close())
📜 클라이언트 코드 예시
import socket
HOST = '127.0.0.1' # 서버 주소
PORT = 9999 # 서버 포트
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))
while True:
message = input("메시지 입력: ")
if message == 'exit':
break
client_socket.send(message.encode())
data = client_socket.recv(1024)
print('서버 응답:', data.decode())
client_socket.close()
⚠️ 주의: 클라이언트를 실행하기 전에 반드시 서버가 먼저 실행되어 있어야 합니다.
그렇지 않으면 연결 오류(ConnectionRefusedError)가 발생할 수 있습니다.
🔌 서버와 클라이언트 연결 실습
이제 실제로 서버와 클라이언트를 실행하여 데이터가 주고받는 과정을 확인해보겠습니다.
실습을 위해서는 두 개의 터미널 창이 필요합니다.
하나는 서버 실행용, 다른 하나는 클라이언트 실행용으로 사용합니다.
▶️ 서버 실행
먼저 서버 코드를 실행합니다.
이후 서버는 지정한 포트에서 클라이언트의 접속을 기다리게 됩니다.
아무런 메시지가 보이지 않더라도 정상적으로 동작하고 있는 상태이니 걱정하지 않아도 됩니다.
▶️ 클라이언트 실행 및 테스트
다른 터미널에서 클라이언트를 실행합니다.
연결이 성공하면 사용자가 입력한 문자열을 서버로 전송할 수 있습니다.
서버는 이 데이터를 그대로 다시 돌려보내며, 클라이언트는 서버의 응답을 출력하게 됩니다.
💬 클라이언트에 “Hello”를 입력하면, 서버 응답으로 “Hello”가 그대로 출력되는 것을 확인할 수 있습니다.
📊 실행 흐름 정리
| 역할 | 동작 |
|---|---|
| 서버 | 포트 열기 → 클라이언트 요청 수락 → 메시지 수신 → 동일한 메시지 반환 |
| 클라이언트 | 서버에 연결 요청 → 메시지 전송 → 서버 응답 수신 → 출력 |
💎 핵심 포인트:
에코 서버와 클라이언트 실행 실습은 네트워크 통신의 가장 기본적인 흐름을 몸소 체험하는 과정입니다.
이 단계를 제대로 이해하면 이후 멀티 클라이언트 지원이나 비동기 서버 구현 같은 확장 개념을 배우는 데 큰 도움이 됩니다.
💡 50줄 구현 코드 전체 공개
마지막으로 블로킹 방식으로 동작하는 TCP 에코 서버와 클라이언트 전체 코드를 공개합니다.
파이썬의 socket 모듈만 활용하여 50줄 이내로 구현할 수 있으며, 서버와 클라이언트 각각 독립적으로 실행해야 합니다.
🖥️ 서버 코드
import socket
HOST = '127.0.0.1'
PORT = 9999
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen()
print("서버 실행 중...")
while True:
client_socket, addr = server_socket.accept()
print('클라이언트 연결:', addr)
while True:
data = client_socket.recv(1024)
if not data:
break
client_socket.sendall(data)
client_socket.close()
📱 클라이언트 코드
import socket
HOST = '127.0.0.1'
PORT = 9999
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))
while True:
message = input("메시지 입력(exit 종료): ")
if message == 'exit':
break
client_socket.send(message.encode())
data = client_socket.recv(1024)
print("서버 응답:", data.decode())
client_socket.close()
⚠️ 주의: 서버 코드와 클라이언트 코드를 동일한 터미널에서 동시에 실행할 수는 없습니다.
반드시 각각 별도의 창에서 실행해야 정상적으로 동작합니다.
위의 예제는 학습 목적으로 단순화된 코드이므로, 실제 서비스 환경에서는 보안 설정, 예외 처리, 다중 클라이언트 지원 등의 추가 구현이 필요합니다.
하지만 네트워크 기초를 이해하고 직접 실행해보는 학습용으로는 충분히 효과적인 예제입니다.
❓ 자주 묻는 질문 (FAQ)
에코 서버란 무엇인가요?
TCP와 UDP 중 어떤 차이가 있나요?
코드를 실행했는데 연결이 안 돼요. 왜 그런가요?
클라이언트에서 exit 입력 시 어떻게 동작하나요?
여러 클라이언트를 동시에 연결할 수 있나요?
recv() 함수에서 데이터 크기는 어떻게 정하나요?
실제 서버 개발에도 이 코드가 쓰이나요?
윈도우와 리눅스 환경 모두 실행 가능한가요?
🚀 파이썬 TCP 에코 서버 클라이언트 학습 정리
이번 글에서는 파이썬을 활용해 단 50줄 내외로 TCP 에코 서버와 클라이언트를 구현하는 방법을 살펴봤습니다.
에코 서버는 클라이언트가 보낸 메시지를 그대로 반환하는 구조로, 네트워크 프로그래밍의 기본 원리를 이해하기에 최적의 예제입니다.
실습 과정에서 소켓 생성, 연결, 데이터 송수신, 연결 종료까지 네트워크 통신의 전체 흐름을 체험할 수 있었죠.
서버와 클라이언트를 별도 터미널에서 실행해 메시지를 주고받는 과정은 실제 네트워크 서비스의 축소판이라 할 수 있습니다.
이 과정을 통해 TCP의 신뢰성 있는 통신 구조를 직접 경험하고, 앞으로 더 복잡한 멀티 클라이언트 서버나 비동기 통신 프로그램을 구현하는 기초를 다질 수 있습니다.
학습 목적이라면 제공된 코드를 직접 실행해보고, 다양한 메시지를 입력하며 작동 원리를 체득해보는 것이 가장 좋은 방법입니다.
🏷️ 관련 태그 : 파이썬소켓, TCP프로그래밍, 에코서버, 클라이언트서버, 네트워크기초, 소켓통신, 파이썬예제, 서버구현, 클라이언트코드, IT학습