Akashic Records

11.1 소켓 프로그래밍 본문

Python for Beginners

11.1 소켓 프로그래밍

Andrew's Akashic Records 2023. 4. 1. 22:02
728x90

파이썬에서 소켓 프로그래밍은 네트워크 상에서 서로 다른 두 프로그램이 통신하기 위한 기술입니다. 소켓은 통신의 끝점 역할을 하며, 두 프로그램이 데이터를 주고받을 수 있게 해줍니다. 주로 클라이언트-서버 모델을 사용하여 통신하며, TCP와 UDP 프로토콜을 사용할 수 있습니다.

파이썬에서는 socket 모듈을 사용하여 소켓 프로그래밍을 할 수 있습니다. 아래 예제에서는 간단한 TCP 기반의 에코 서버와 클라이언트를 구현해 보겠습니다.

서버 코드:

import socket

# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 주소 재사용 옵션 설정
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 서버 소켓에 IP와 포트 할당
server_socket.bind(('localhost', 12345))

# 클라이언트의 연결 요청을 기다리기
server_socket.listen(1)

print('Server is listening on port 12345...')

# 클라이언트 연결 수락
client_socket, client_address = server_socket.accept()
print(f'Connected with {client_address}')

# 클라이언트로부터 데이터 수신 및 에코 전송
data = client_socket.recv(1024)
client_socket.sendall(data)

# 소켓 닫기
client_socket.close()
server_socket.close()

 

클라이언트 코드:

import socket

# 클라이언트 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 서버에 연결
client_socket.connect(('localhost', 12345))

# 데이터 전송
client_socket.sendall(b'Hello, Server!')

# 에코된 데이터 수신
data = client_socket.recv(1024)
print(f'Received from server: {data}')

# 소켓 닫기
client_socket.close()

 

이 예제에서 서버는 포트 12345에서 클라이언트의 연결 요청을 기다립니다. 클라이언트가 연결되면, 서버는 클라이언트로부터 데이터를 받고, 동일한 데이터를 클라이언트에게 다시 전송합니다. 이때 클라이언트는 서버로부터 전송받은 데이터를 출력합니다.

TCP 기반의 소켓 프로그래밍은 연결이 맺어진 후에 데이터를 전송하며, 데이터 전송의 신뢰성이 보장됩니다. 반면에 UDP 기반의 소켓 프로그래밍은 연결이 없이 데이터를 전송하며, 빠른 전송 속도와 낮은 지연 시간을 가집니다. UDP 소켓을 사용하려면, socket.SOCK_DGRAM을 사용하여 소켓을 생성하고, 데이터 전송에 sendto와 recvfrom 메서드를 사용합니다. 다음은 간단한 UDP 기반의 에코 서버와 클라이언트를 구현한 예제입니다.

서버 코드:

import socket

# 서버 소켓 생성 (UDP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 주소 재사용 옵션 설정
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 서버 소켓에 IP와 포트 할당
server_socket.bind(('localhost', 12345))

print('Server is listening on port 12345...')

# 클라이언트로부터 데이터 수신 및 에코 전송
data, client_address = server_socket.recvfrom(1024)
print(f'Received from {client_address}: {data}')
server_socket.sendto(data, client_address)

# 소켓 닫기
server_socket.close()


클라이언트 코드:

import socket

# 클라이언트 소켓 생성 (UDP)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 데이터 전송
client_socket.sendto(b'Hello, Server!', ('localhost', 12345))

# 에코된 데이터 수신
data, server_address = client_socket.recvfrom(1024)
print(f'Received from server: {data}')

# 소켓 닫기
client_socket.close()

 

이 예제에서 서버는 포트 12345에서 클라이언트로부터 데이터를 기다립니다. 클라이언트가 데이터를 보내면, 서버는 클라이언트로부터 데이터를 받고, 동일한 데이터를 클라이언트에게 다시 전송합니다. 이때 클라이언트는 서버로부터 전송받은 데이터를 출력합니다.

파이썬의 socket 모듈을 사용하여 소켓 프로그래밍을 할 때 주의할 점은, 데이터를 전송할 때는 바이트 형태로 전송해야 한다는 것입니다. 문자열을 전송하려면 encode 메서드를 사용하여 바이트로 변환하고, 바이트 데이터를 문자열로 변환하려면 decode 메서드를 사용하세요.

728x90

'Python for Beginners' 카테고리의 다른 글

11.3 비동기 프로그래밍  (0) 2023.04.01
11.2 멀티스레딩 및 멀티프로세싱  (0) 2023.04.01
10.3 ORM(Object-Relational Mapping)  (0) 2023.03.31
10.2 NoSQL 데이터베이스  (0) 2023.03.31
10.1 SQL 데이터베이스  (0) 2023.03.31
Comments