프로그래밍/Python

[Python 강의] 18강 - 네트워킹 프로그래밍

월횽 2024. 10. 23. 06:30
728x90
반응형
SMALL

안녕하세요! 그레이 해커 월횽입니다. 오늘은 Python을 활용한 네트워킹 프로그래밍에 대해 알아보겠습니다. 네트워킹 프로그래밍은 컴퓨터 간의 데이터 전송, 소켓 통신, 서버-클라이언트 모델을 다루는 분야입니다. Python은 네트워크 작업을 쉽게 처리할 수 있는 다양한 라이브러리를 제공합니다. 오늘은 그 중에서도 socket 모듈을 사용해 네트워킹 프로그래밍을 배우고, 간단한 클라이언트-서버 모델을 구현해 보겠습니다.

 

 

1. 네트워크 통신의 기본 개념

네트워킹 프로그래밍에서 중요한 개념은 IP 주소, 포트 번호, 프로토콜입니다.

· IP 주소: 컴퓨터가 네트워크 상에서 인식되는 주소입니다.
· 포트 번호: 네트워크 서비스가 사용하는 논리적 접점을 나타내며, 하나의 IP 주소에서 여러 서비스를 구분하는 역할을 합니다.
· TCP/IP: 가장 일반적으로 사용되는 통신 프로토콜로, 안정적이고 신뢰할 수 있는 데이터 전송을 보장합니다.

 

 

2. socket 모듈을 사용한 기본 소켓 프로그래밍

Python에서 socket 모듈을 사용하면 TCP와 UDP 프로토콜을 이용한 네트워크 통신을 쉽게 구현할 수 있습니다.

 

TCP 클라이언트와 서버 구현 예시

서버 코드 (TCP)

import socket

# 서버 소켓 설정
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 9999))
server_socket.listen(1)

print('서버가 클라이언트를 기다리고 있습니다...')

# 클라이언트 연결 수락
client_socket, addr = server_socket.accept()
print(f'{addr}에서 클라이언트가 연결되었습니다.')

# 클라이언트로부터 메시지 수신
data = client_socket.recv(1024)
print(f'클라이언트로부터 받은 메시지: {data.decode()}')

# 클라이언트에게 응답 메시지 전송
client_socket.send('안녕하세요, 클라이언트님!'.encode())

# 소켓 종료
client_socket.close()
server_socket.close()

 

반응형

클라이언트 코드 (TCP)

import socket

# 서버에 연결할 클라이언트 소켓 설정
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 9999))

# 서버에 메시지 전송
client_socket.send('안녕하세요, 서버님!'.encode())

# 서버로부터 응답 수신
data = client_socket.recv(1024)
print(f'서버로부터 받은 메시지: {data.decode()}')

# 소켓 종료
client_socket.close()

 

 

 

3. UDP 소켓 프로그래밍

UDP는 TCP와 달리 연결 기반이 아니며, 데이터 전송의 신뢰성을 보장하지 않는 대신 더 빠릅니다. 실시간 데이터 전송이 중요한 게임, 스트리밍 등에 많이 사용됩니다.

 

UDP 클라이언트와 서버 구현 예시

서버 코드 (UDP)

import socket

# 서버 소켓 설정
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 9999))

print('UDP 서버가 클라이언트를 기다리고 있습니다...')

# 클라이언트로부터 데이터 수신
data, addr = server_socket.recvfrom(1024)
print(f'{addr}에서 받은 메시지: {data.decode()}')

# 클라이언트에게 응답 전송
server_socket.sendto('안녕하세요, 클라이언트님!'.encode(), addr)

# 소켓 종료
server_socket.close()

 

728x90

클라이언트 코드 (UDP)

import socket

# 클라이언트 소켓 설정
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 서버에 메시지 전송
client_socket.sendto('안녕하세요, UDP 서버님!'.encode(), ('localhost', 9999))

# 서버로부터 응답 수신
data, addr = client_socket.recvfrom(1024)
print(f'서버로부터 받은 메시지: {data.decode()}')

# 소켓 종료
client_socket.close()

 

 

 

4. 서버-클라이언트 모델 확장

서버-클라이언트 모델을 확장하면 여러 클라이언트가 동시에 서버에 접속하는 다중 클라이언트 처리를 구현할 수 있습니다. 이를 위해 멀티스레딩이나 비동기 처리를 사용할 수 있습니다.

SMALL

멀티스레드 TCP 서버 예시

import socket
import threading

def handle_client(client_socket):
    # 클라이언트로부터 데이터 수신
    data = client_socket.recv(1024)
    print(f'클라이언트로부터 받은 메시지: {data.decode()}')
    
    # 클라이언트에게 응답 전송
    client_socket.send('안녕하세요, 멀티스레드 서버입니다!'.encode())
    
    # 소켓 종료
    client_socket.close()

# 서버 소켓 설정
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 9999))
server_socket.listen(5)
print('서버가 클라이언트를 기다리고 있습니다...')

# 여러 클라이언트 처리
while True:
    client_socket, addr = server_socket.accept()
    print(f'{addr}에서 클라이언트가 연결되었습니다.')
    
    # 스레드 생성하여 클라이언트 처리
    client_handler = threading.Thread(target=handle_client, args=(client_socket,))
    client_handler.start()

 

 

 

5. 네트워킹 프로그래밍의 모범 사례

· 비동기 처리: 많은 클라이언트가 동시에 접속할 경우 asyncio를 사용해 비동기 방식으로 서버를 구성할 수 있습니다.
· 에러 핸들링: 네트워크 환경에서는 예기치 못한 오류가 발생할 수 있기 때문에 적절한 예외 처리를 해야 합니다.
· 보안: 민감한 데이터를 주고받을 때는 SSL/TLS로 통신을 암호화하여 보안을 강화해야 합니다.

 

6. 네트워킹 프로그래밍 정리

· socket 모듈을 사용해 TCP/UDP 소켓 프로그래밍을 쉽게 구현할 수 있습니다.
· 멀티스레드를 통해 여러 클라이언트를 동시에 처리할 수 있습니다.
· 더 복잡한 네트워크 서비스는 비동기 처리와 보안 기능을 결합하여 확장할 수 있습니다.

 

다음 시간에는 Python을 활용한 웹 개발 기초에 대해 알아보겠습니다!

 

 

 

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST