상세 컨텐츠

본문 제목

파이썬으로 쉽게 배우는 네트워크 프로그래밍의 세계

카테고리 없음

by jbmu6 2025. 3. 31. 22:14

본문

실전 예제로 배우는 파이썬 네트워크 프로그래밍

서론

현대 사회에서 네트워크 프로그래밍은 매우 중요한 역할을 합니다. 많은 기업과 개인들이 다양한 네트워크 애플리케이션을 개발하려고 하며, 이러한 개발을 위해 파이썬은 훌륭한 선택이 됩니다. 본 블로그 포스트에서는 파이썬을 이용한 네트워크 프로그래밍의 기본 개념 및 실제 예제를 통해 배우는 방법에 대해 알아보겠습니다.

파이썬 네트워크 프로그래밍의 기초

파이썬은 간단하고 읽기 쉬운 문법으로 인해 초보자에게 적합한 언어입니다. 또한, 파이썬은 강력한 라이브러리와 모듈을 제공하여 다양한 네트워크 프로그래밍 작업을 간편하게 수행할 수 있습니다. 이 섹션에서는 파이썬의 네트워크 프로그래밍을 위한 기본적인 요소와 개념을 설명합니다.

소켓(Socket) 개념

소켓은 네트워크 통신을 위한 종단점(timestamp)입니다. 소켓은 두 대의 컴퓨터 간에 데이터를 송수신하기 위한 방법을 제공합니다. 파이썬의 내장 라이브러리인 socket을 사용하여 소켓을 기반으로 한 네트워크 통신을 구현할 수 있습니다.

TCP와 UDP

네트워크 프로그래밍에서는 주로 두 가지 프로토콜을 사용합니다: TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol).

  • TCP: 신뢰성 높은 연결-oriented 방식으로, 데이터가 안전하게 전송되도록 보장합니다.
  • UDP: 신뢰성 있는 전송을 보장하지 않는 connection-less 방식으로, 속도가 중요할 때 사용됩니다.

실전 예제: 간단한 TCP 서버와 클라이언트 구축하기

TCP 서버 생성하기

먼저, TCP 서버를 생성하는 방법을 알아보겠습니다. 아래는 간단한 TCP 서버 코드입니다.

import socket

서버 소켓 생성

serversocket = socket.socket(socket.AFINET, socket.SOCK_STREAM)

서버 주소 및 포트 설정

server_address = ('localhost', 65432)
serversocket.bind(serveraddress)

클라이언트의 요청을 수신하기 위한 준비

server_socket.listen()

print('서버가 실행 중입니다...')

while True:

클라이언트 연결 수락

    clientsocket, clientaddress = server_socket.accept()
    print(f'클라이언트 {client_address}가 연결되었습니다.')

데이터 수신

    data = client_socket.recv(1024)
    print(f'수신한 데이터: {data.decode()}')

응답 전송

    client_socket.sendall(b'안녕하세요, 클라이언트!')

소켓 닫기

    client_socket.close()

TCP 클라이언트 만들기

이제 클라이언트를 만들어 서버와 통신해 보겠습니다. 아래는 간단한 TCP 클라이언트 코드입니다.

import socket

클라이언트 소켓 생성

clientsocket = socket.socket(socket.AFINET, socket.SOCK_STREAM)

서버 주소 및 포트 설정

server_address = ('localhost', 65432)

서버에 연결

clientsocket.connect(serveraddress)

데이터 전송

client_socket.sendall(b'안녕하세요, 서버!')

응답 수신

data = client_socket.recv(1024)
print(f'서버로부터의 응답: {data.decode()}')

소켓 닫기

client_socket.close()

네트워크 프로그래밍의 응용

파일 전송 프로그램 개발

네트워크 프로그래밍의 한 가지 유용한 응용은 파일 전송입니다. TCP 소켓을 사용하여 파일을 전송할 수 있는 프로그램을 작성하는 방법을 알아보겠습니다.

서버 측 코드

import socket

서버 소켓 생성

serversocket = socket.socket(socket.AFINET, socket.SOCK_STREAM)

서버 주소 및 포트 설정

server_address = ('localhost', 65432)
serversocket.bind(serveraddress)

클라이언트의 요청을 수신하기 위한 준비

server_socket.listen()
print('서버가 실행 중입니다...')

while True:
    clientsocket, clientaddress = server_socket.accept()
    print(f'클라이언트 {client_address}가 연결되었습니다.')

파일 전송

    with open('전송할파일.txt', 'rb') as file:
        file_data = file.read()
        clientsocket.sendall(filedata)

소켓 닫기

    client_socket.close()

클라이언트 측 코드

import socket

클라이언트 소켓 생성

clientsocket = socket.socket(socket.AFINET, socket.SOCK_STREAM)

서버 주소 및 포트 설정

server_address = ('localhost', 65432)

서버에 연결

clientsocket.connect(serveraddress)

파일 수신

with open('수신한파일.txt', 'wb') as file:
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        file.write(data)

소켓 닫기

client_socket.close()

채팅 애플리케이션 개발

채팅 애플리케이션은 네트워크 프로그래밍의 흥미로운 예입니다. 여러 사용자가 동시에 메시지를 주고받을 수 있는 애플리케이션을 만들어 보겠습니다.

서버 코드

import socket
import threading

클라이언트를 저장할 리스트

clients = []

def handleclient(clientsocket):
    while True:
        try:
            message = client_socket.recv(1024)
            if message:
                broadcast(message)
            else:
                break
        except:
            break
    client_socket.close()

def broadcast(message):
    for client in clients:
        client.send(message)

서버 소켓 생성

serversocket = socket.socket(socket.AFINET, socket.SOCK_STREAM)

server_address = ('localhost', 65432)

serversocket.bind(serveraddress)
server_socket.listen()

print('서버가 실행 중입니다...')

while True:
    clientsocket, clientaddress = server_socket.accept()
    clients.append(client_socket)
    print(f'클라이언트 {client_address}가 연결되었습니다.')

클라이언트를 별도의 스레드로 핸들링

    threading.Thread(target=handleclient, args=(clientsocket,)).start()

클라이언트 코드

import socket
import threading

def receivemessages(clientsocket):
    while True:
        message = client_socket.recv(1024)
        print(message.decode())

clientsocket = socket.socket(socket.AFINET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 65432))

수신을 위한 스레드 시작

threading.Thread(target=receivemessages, args=(clientsocket,)).start()

while True:
    message = input()
    client_socket.send(message.encode())

결론

이번 블로그 포스트에서는 파이썬을 사용한 네트워크 프로그래밍의 기초부터 실전 예제까지 알아보았습니다. 서버와 클라이언트의 개념, TCP와 UDP 프로토콜, 간단한 파일 전송 및 채팅 애플리케이션 개발까지 다양한 예제를 통해 네트워크 프로그래밍의 기본을 이해할 수 있었습니다. 초보자도 쉽게 접근할 수 있는 파이썬의 강력한 기능을 통해 재밌고 유익한 네트워크 프로그램을 만들어 보시길 바랍니다.