Socket은 네트워크 통신을 위한 프로그래밍 인터페이스입니다. 소켓은 클라이언트와 서버 간의 데이터 통신을 가능하게 해주는 중요한 요소입니다. Python은 기본적으로 socket 모듈을 제공하여 손쉽게 서버 소켓을 만들고 관리할 수 있습니다. 이 글에서는 Python을 사용하여 간단한 socket 서버 소켓을 만드는 방법을 알아보겠습니다.
소켓 서버 생성하기
아래의 예제 코드는 Python의 socket 모듈을 사용하여 간단한 TCP 서버 소켓을 만드는 방법을 보여줍니다.
import socket
# 서버 정보
HOST = 'localhost'
PORT = 12345
# 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 소켓에 IP와 Port 바인딩
server_socket.bind((HOST, PORT))
# 클라이언트의 연결을 대기
server_socket.listen()
print('서버가 시작되었습니다.')
# 클라이언트로부터 연결 요청이 들어올 때까지 대기
client_socket, addr = server_socket.accept()
print('새로운 클라이언트가 연결되었습니다:', addr)
# 클라이언트로부터 메시지 수신
data = client_socket.recv(1024)
# 수신한 데이터 출력
print('수신한 데이터:', data.decode())
# 클라이언트에게 응답 메시지 전송
response = '서버로부터 응답 메시지입니다.'
client_socket.sendall(response.encode())
# 연결 종료
client_socket.close()
server_socket.close()
소켓 서버 동작 원리
위의 예제 코드에서는 우선 socket.socket()
함수를 사용하여 소켓을 생성합니다. 이때 socket.AF_INET
은 IPv4 주소 체계를 사용하고 socket.SOCK_STREAM
은 TCP 프로토콜을 사용함을 나타냅니다. 소켓을 생성한 후 bind()
함수를 사용하여 소켓에 IP와 Port를 바인딩합니다. 그 다음 listen()
함수를 사용하여 클라이언트의 연결 요청을 대기합니다.
클라이언트로부터의 연결 요청이 들어오면 accept()
함수를 사용하여 해당 요청을 수락하고 클라이언트와 연결된 새로운 소켓과 클라이언트의 정보를 반환합니다. 이후 recv()
함수를 사용하여 클라이언트로부터 데이터를 수신합니다.
수신한 데이터를 처리한 후, sendall()
함수를 사용하여 클라이언트에게 응답 메시지를 전송합니다. 마지막으로 클라이언트와의 연결을 종료하고 소켓을 닫습니다.
실행 및 테스트
위의 예제 코드를 실행하기 전에 주의해야 할 점은 Port 번호가 이미 사용 중이지 않은지 확인하는 것입니다. 실행 후, 다른 클라이언트 애플리케이션에서 해당 Port 번호로 서버에 연결을 요청할 수 있습니다.
Python은 다양한 방법으로 소켓을 테스트하는데, 예를 들어 새로운 Python 파일을 생성하고 아래의 코드를 작성하여 테스트할 수 있습니다.
import socket
# 서버 정보
HOST = 'localhost'
PORT = 12345
# 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버에 연결
client_socket.connect((HOST, PORT))
# 서버로 전송할 메시지
message = '안녕하세요, 서버!'
# 메시지 전송
client_socket.sendall(message.encode())
# 서버로부터 응답 메시지 수신
response = client_socket.recv(1024)
# 수신한 데이터 출력
print('서버로부터 받은 응답:', response.decode())
# 연결 종료
client_socket.close()
위의 코드를 실행하면 서버에 연결하고 메시지를 전송한 후, 서버로부터의 응답을 수신하여 출력합니다.
이제 Python의 socket 모듈을 사용하여 간단한 소켓 서버를 만드는 방법을 알게되었습니다. 소켓을 사용하면 클라이언트와 서버 간의 실시간 데이터 통신을 구현할 수 있으며, 다양한 네트워크 애플리케이션을 개발할 수 있습니다.