728x90
반응형
Python socket 모듈을 이용한 네트워크 프로그래밍
Python은 다양한 네트워크 프로그래밍 작업을 지원하는 강력한 표준 라이브러리를 제공합니다. 그중에서도 socket
모듈은 네트워크 통신을 구현하는 핵심 도구입니다. 이번 포스팅에서는 Python의 socket
모듈을 사용해 네트워크 프로그래밍의 기초를 이해하고, 간단한 예제를 통해 실습해보겠습니다.
1. socket 모듈 소개
socket
모듈은 저수준 네트워크 인터페이스를 제공합니다. 이를 통해 개발자는 네트워크 소켓을 생성하고 데이터를 송수신할 수 있습니다.
주요 기능
- TCP와 UDP 소켓 지원
- IP 주소와 포트 번호를 통한 네트워크 연결
- 클라이언트와 서버 간의 데이터 송수신
기본 구조
네트워크 프로그래밍은 보통 다음 단계를 따릅니다:
- 소켓 생성
- 주소 및 포트 바인딩 (서버)
- 연결 대기 및 수락 (서버)
- 연결 요청 (클라이언트)
- 데이터 송수신
- 소켓 닫기
2. Python socket 모듈 주요 함수
socket.socket(family, type, proto=0)
- 소켓 생성 함수입니다.
family
: 주소 체계 (AF_INET
- IPv4,AF_INET6
- IPv6)type
: 소켓 유형 (SOCK_STREAM
- TCP,SOCK_DGRAM
- UDP)
bind(address)
- 서버 측에서 IP 주소와 포트를 지정합니다.
listen(backlog)
- 서버가 클라이언트 연결을 대기하도록 설정합니다.
accept()
- 클라이언트의 연결 요청을 수락합니다.
connect(address)
- 클라이언트가 서버에 연결 요청을 보냅니다.
send(data)
/recv(buffer_size)
- 데이터를 송수신합니다.
close()
- 소켓을 닫습니다.
3. TCP 서버와 클라이언트 예제
TCP 서버 코드
아래는 TCP 서버를 구현한 코드입니다. 클라이언트 연결을 대기하며, 연결된 클라이언트로부터 메시지를 수신합니다.
import socket
# 서버 설정
HOST = '127.0.0.1' # 로컬호스트
PORT = 65432 # 사용할 포트 번호
# 소켓 생성
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.bind((HOST, PORT)) # 주소와 포트 바인딩
server_socket.listen() # 클라이언트 연결 대기
print(f"Server listening on {HOST}:{PORT}")
conn, addr = server_socket.accept() # 연결 수락
with conn:
print(f"Connected by {addr}")
while True:
data = conn.recv(1024) # 데이터 수신 (최대 1024 바이트)
if not data:
break
print(f"Received: {data.decode()}")
conn.sendall(data) # 받은 데이터를 그대로 응답
TCP 클라이언트 코드
클라이언트는 서버에 연결하고 메시지를 전송합니다.
import socket
# 서버 설정
HOST = '127.0.0.1' # 서버 주소
PORT = 65432 # 서버 포트 번호
# 소켓 생성
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
client_socket.connect((HOST, PORT)) # 서버에 연결
client_socket.sendall(b'Hello, Server!') # 메시지 전송
data = client_socket.recv(1024) # 응답 수신
print(f"Received from server: {data.decode()}")
실행 결과
- 서버를 먼저 실행합니다.
- 클라이언트를 실행하면 "Hello, Server!" 메시지가 서버에 전송되고, 서버는 이를 응답합니다.
- 서버와 클라이언트의 콘솔에서 메시지를 확인할 수 있습니다.
4. UDP 서버와 클라이언트 예제
TCP는 연결 지향 방식인 반면, UDP는 비연결 지향 방식입니다. 따라서 UDP에서는 연결 설정 과정이 없습니다.
UDP 서버 코드
import socket
# 서버 설정
HOST = '127.0.0.1'
PORT = 65433
# 소켓 생성
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as server_socket:
server_socket.bind((HOST, PORT))
print(f"UDP Server listening on {HOST}:{PORT}")
while True:
data, addr = server_socket.recvfrom(1024) # 데이터 수신
print(f"Received from {addr}: {data.decode()}")
server_socket.sendto(data, addr) # 받은 데이터를 응답
UDP 클라이언트 코드
import socket
# 서버 설정
HOST = '127.0.0.1'
PORT = 65433
# 소켓 생성
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as client_socket:
message = b'Hello, UDP Server!'
client_socket.sendto(message, (HOST, PORT)) # 메시지 전송
data, server = client_socket.recvfrom(1024) # 응답 수신
print(f"Received from server: {data.decode()}")
실행 결과
- UDP 서버를 실행합니다.
- 클라이언트를 실행하면 "Hello, UDP Server!" 메시지가 서버에 전송되고, 서버는 이를 응답합니다.
- 서버와 클라이언트의 콘솔에서 메시지를 확인할 수 있습니다.
5. 네트워크 프로그래밍에서 주의할 점
- 예외 처리: 네트워크 환경은 불안정할 수 있으므로 예외 처리 코드를 추가해야 합니다.
- 멀티스레딩: 다수의 클라이언트를 처리하려면 멀티스레딩 또는 비동기 프로그래밍을 고려해야 합니다.
- 보안: 데이터 암호화와 인증 과정을 통해 보안을 강화해야 합니다.
- 리소스 관리: 사용 후 소켓을 반드시 닫아야 합니다.
예외 처리 예시
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
print("Server running...")
except socket.error as e:
print(f"Socket error: {e}")
6. 결론
Python의 socket
모듈은 강력하고 유연한 네트워크 프로그래밍 도구입니다. 이번 포스팅에서는 TCP와 UDP의 기본 사용법과 예제를 다루었습니다. 더 복잡한 네트워크 프로그래밍을 구현하려면 비동기 I/O (asyncio
모듈)나 멀티스레딩/멀티프로세싱과 결합해 사용할 수 있습니다.
Python 네트워크 프로그래밍의 첫걸음을 시작하며, 다양한 응용 프로그램을 만들어 보세요!
728x90
반응형
'Python > Python 심화' 카테고리의 다른 글
Python REST API 요청 처리와 응답 분석 (0) | 2025.08.07 |
---|---|
Python asyncio를 활용한 비동기 네트워크 통신 (0) | 2025.08.06 |
웹 스크래핑을 위한 Python BeautifulSoup와 Scrapy (0) | 2025.08.04 |
Python FastAPI로 REST API 개발하기 (0) | 2025.08.03 |
Python Django를 이용한 웹 애플리케이션 구축 (0) | 2025.08.02 |