python

19편 Python 네트워킹과 소켓 프로그래밍

파이썬 티쳐 2024. 11. 23. 09:55

1. 네트워킹의 기초 개념

1.1 네트워크란 무엇인가

네트워크(Network)는 컴퓨터나 장치들이 상호 연결되어 데이터를 주고받을 수 있는 구조입니다. 예를 들어, 인터넷은 전 세계의 컴퓨터들이 연결된 거대한 네트워크입니다.

1.2 클라이언트와 서버의 개념

클라이언트(Client): 서비스를 요청하는 컴퓨터나 프로그램입니다.

서버(Server): 클라이언트의 요청을 받아 응답하는 컴퓨터나 프로그램입니다.

1.3 IP 주소와 포트 번호의 개념

IP 주소: 네트워크 상에서 장치를 식별하기 위한 고유한 숫자 주소입니다.

포트 번호: 특정 IP 주소의 특정 서비스에 접근하기 위한 번호입니다.

1.4 Python에서 네트워킹 관련 라이브러리 소개

Python은 socket, http.client, urllib 등의 네트워킹 관련 라이브러리를 제공합니다.

2. 소켓 프로그래밍

2.1 socket 모듈을 사용한 소켓 프로그래밍 기초

socket 모듈을 사용하여 네트워크 상에서 클라이언트와 서버 간에 데이터를 주고받을 수 있습니다.

import socket

2.2 서버 소켓과 클라이언트 소켓의 차이

서버 소켓: 클라이언트의 요청을 받아들이는 역할을 합니다.

클라이언트 소켓: 서버에 연결을 요청하고, 데이터를 주고받습니다.

2.3 간단한 TCP 서버와 클라이언트 프로그램 작성

TCP 서버 코드:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("서버 대기 중...")
conn, addr = server_socket.accept()
print(f"{addr}에서 접속됨")

data = conn.recv(1024)
print(f"받은 데이터: {data.decode()}")
conn.sendall("Hello, Client!".encode())
conn.close()

TCP 클라이언트 코드:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))

client_socket.sendall("Hello, Server!".encode())
data = client_socket.recv(1024)
print(f"서버로부터 받은 데이터: {data.decode()}")
client_socket.close()

2.4 소켓 프로그래밍에서 발생하는 오류 처리

소켓 프로그래밍에서 연결 실패, 타임아웃 등의 오류는 try, except 구문으로 처리할 수 있습니다.

try:
    client_socket.connect(('localhost', 12345))
except socket.error as e:
    print(f"연결 오류: {e}")

3. 네트워킹 프로그램 예제

3.1 간단한 채팅 프로그램 만들기

서버 코드:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("채팅 서버 대기 중...")

conn, addr = server_socket.accept()
print(f"{addr}에서 접속됨")

while True:
    msg = conn.recv(1024).decode()
    if msg.lower() == "exit":
        print("클라이언트 연결 종료")
        break
    print(f"클라이언트: {msg}")
    reply = input("서버: ")
    conn.send(reply.encode())

conn.close()

클라이언트 코드:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))

while True:
    msg = input("클라이언트: ")
    client_socket.send(msg.encode())
    if msg.lower() == "exit":
        print("서버와 연결 종료")
        break
    reply = client_socket.recv(1024).decode()
    print(f"서버: {reply}")

client_socket.close()

3.2 파일 전송 프로그램 구현

서버 코드:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)

print("서버 대기 중...")
conn, addr = server_socket.accept()

with open('received_file.txt', 'wb') as f:
    print("파일 수신 중...")
    while True:
        data = conn.recv(1024)
        if not data:
            break
        f.write(data)

print("파일 수신 완료")
conn.close()

클라이언트 코드:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))

with open('send_file.txt', 'rb') as f:
    print("파일 전송 중...")
    for data in f:
        client_socket.sendall(data)

print("파일 전송 완료")
client_socket.close()