
소켓은 다음과 같이 socket 모듈을 이용하여 생성할 수 있습니다.
import socket
my_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
my_socket.close()
IP 프로토콜의 버전은 크게 4와 6이 존재합니다.
각 버전은 다음과 같이 사용할 수 있습니다.
| IP Version | Value |
|---|---|
| IPv4 | socket.AF_INET |
| IPv6 | socket.AF_INET6 |
소켓의 타입은 크게 TCP, UDP, RAW를 사용할 수 있습니다.
각 타입은 다음과 같이 사용할 수 있습니다.
| Type | Value |
|---|---|
| TCP | socket.SOCK_STREAM |
| UDP | socket.SOCK_DGRAM |
| RAW | socket.SOCK_RAW |
클라이언트의 접속 요청을 승인하고 클라이언트가 보내는 메시지를 받아서
그대로 클라이언트에게 전송하는 기능을 수행하도록 하는 ECHO 서버를 작성해 봅니다.
import socket
# 클라이언트가 접속할 IP 주소와 포트 번호
HOST = ""
PORT = 9999
# IPv4 TCP 소켓 객체를 생성
server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 포트를 사용하고 있더라도 해당 포트를 사용 가능 (기본적으로는 불가능)
# 서버의 종료 과정에서 빠르게 다시 소켓을 사용 가능
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 소켓을 특정 네트워크 인터페이스와 포트 번호에 연결
server_socket.bind((HOST, PORT))
# 서버가 클라이언트의 접속을 허용
# > netstat -an | findstr 9999
# TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING
server_socket.listen()
# 접속 요청을 기다리다가 클라이언트가 접속하면 새로운 소켓과 주소(출발지 IP 주소, 출발지 포트 번호)를 반환
client_socket, remote_addr = server_socket.accept()
while True:
# 데이터 수신 대기
data = client_socket.recv(1024)
# 클라이언트의 접속이 해제되면 중지
if not data:
break
# 데이터 출력
print(f"[{remote_addr[0]}] {data.decode()}")
# 클라이언트로 데이터 전송
client_socket.sendall(data)
# 소켓 종료
client_socket.close()
server_socket.close()
지정된 서버로 접속 후 데이터를 전송합니다.
이후 서버가 전송한 데이터를 수신 후 세션을 종료합니다.
import socket
# 클라이언트가 접속할 IP 주소와 포트 번호
HOST = "127.0.0.1"
PORT = 9999
# IPv4 TCP 소켓 객체를 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버에 접속 (서버의 accept가 수행됨)
client_socket.connect((HOST, PORT))
# 데이터 전송
client_socket.sendall("Hello, World".encode())
# 데이터 수신
data = client_socket.recv(1024)
print(f"[{HOST}] {data.decode()}")
# 소켓 종료
client_socket.close()