19장: 네트워크 프로그래밍

파이썬은 네트워크 프로그래밍을 위한 다양한 라이브러리를 제공하여 소켓을 사용한 저수준 네트워크 프로그래밍부터 HTTP 요청을 처리하는 고수준 네트워크 프로그래밍까지 지원합니다. 이 장에서는 네트워크 프로그래밍의 기본 개념과 파이썬을 사용한 네트워크 프로그래밍 예제를 알아보겠습니다.


#### 19.1 소켓 프로그래밍


소켓 프로그래밍은 네트워크를 통해 데이터 통신을 가능하게 하는 기술입니다. 파이썬의 `socket` 모듈을 사용하여 소켓을 생성하고 데이터를 송수신할 수 있습니다.


##### 19.1.1 서버 예제


다음은 TCP 서버를 생성하는 예제입니다.


```python

import socket


# 소켓 생성

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 주소와 포트 설정

server_socket.bind(('localhost', 12345))


# 클라이언트의 연결을 대기

server_socket.listen(5)

print('서버가 시작되었습니다. 클라이언트를 기다립니다...')


# 클라이언트 연결 수락

client_socket, addr = server_socket.accept()

print(f'클라이언트가 연결되었습니다: {addr}')


# 데이터 수신

data = client_socket.recv(1024)

print(f'받은 데이터: {data.decode()}')


# 데이터 송신

client_socket.sendall('서버로부터의 응답'.encode())


# 연결 종료

client_socket.close()

server_socket.close()

```


##### 19.1.2 클라이언트 예제


다음은 TCP 클라이언트를 생성하는 예제입니다.


```python

import socket


# 소켓 생성

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 서버에 연결

client_socket.connect(('localhost', 12345))


# 데이터 송신

client_socket.sendall('클라이언트로부터의 요청'.encode())


# 데이터 수신

data = client_socket.recv(1024)

print(f'받은 데이터: {data.decode()}')


# 연결 종료

client_socket.close()

```


#### 19.2 HTTP 요청


`requests` 라이브러리는 HTTP 요청을 간편하게 처리할 수 있는 고수준의 인터페이스를 제공합니다. 먼저 `requests` 라이브러리를 설치해야 합니다.


```sh

pip install requests

```


##### 19.2.1 GET 요청


다음은 `requests`를 사용하여 GET 요청을 보내는 예제입니다.


```python

import requests


# GET 요청

response = requests.get('https://api.github.com')


# 상태 코드 확인

print(response.status_code)


# 응답 데이터 확인

print(response.json())

```


##### 19.2.2 POST 요청


다음은 `requests`를 사용하여 POST 요청을 보내는 예제입니다.


```python

import requests


# POST 요청 데이터

data = {'key': 'value'}


# POST 요청

response = requests.post('https://httpbin.org/post', data=data)


# 상태 코드 확인

print(response.status_code)


# 응답 데이터 확인

print(response.json())

```


#### 19.3 웹 소켓


웹 소켓(WebSocket)은 실시간 양방향 통신을 가능하게 하는 프로토콜입니다. `websockets` 라이브러리를 사용하여 웹 소켓 서버와 클라이언트를 구현할 수 있습니다. 먼저 `websockets` 라이브러리를 설치해야 합니다.


```sh

pip install websockets

```


##### 19.3.1 웹 소켓 서버


다음은 `websockets` 라이브러리를 사용하여 웹 소켓 서버를 구현하는 예제입니다.


```python

import asyncio

import websockets


async def handler(websocket, path):

    data = await websocket.recv()

    print(f"받은 데이터: {data}")


    await websocket.send("서버로부터의 응답")

    print("응답 전송")


# 서버 시작

start_server = websockets.serve(handler, 'localhost', 12345)


# 이벤트 루프 실행

asyncio.get_event_loop().run_until_complete(start_server)

asyncio.get_event_loop().run_forever()

```


##### 19.3.2 웹 소켓 클라이언트


다음은 `websockets` 라이브러리를 사용하여 웹 소켓 클라이언트를 구현하는 예제입니다.


```python

import asyncio

import websockets


async def client():

    async with websockets.connect('ws://localhost:12345') as websocket:

        await websocket.send("클라이언트로부터의 요청")

        print("요청 전송")


        data = await websocket.recv()

        print(f"받은 데이터: {data}")


# 클라이언트 실행

asyncio.get_event_loop().run_until_complete(client())

```


#### 19.4 이메일 보내기


파이썬의 `smtplib` 모듈을 사용하여 이메일을 보낼 수 있습니다.


```python

import smtplib

from email.mime.text import MIMEText


# SMTP 서버 설정

smtp_server = 'smtp.example.com'

smtp_port = 587

username = 'your_email@example.com'

password = 'your_password'


# 이메일 내용 설정

subject = '제목'

body = '내용'

msg = MIMEText(body)

msg['Subject'] = subject

msg['From'] = username

msg['To'] = 'recipient@example.com'


# 이메일 보내기

with smtplib.SMTP(smtp_server, smtp_port) as server:

    server.starttls()

    server.login(username, password)

    server.sendmail(username, 'recipient@example.com', msg.as_string())


print("이메일이 성공적으로 발송되었습니다.")

```


이상으로, 파이썬에서 네트워크 프로그래밍을 수행하는 방법에 대해 알아보았습니다. 다음 장에서는 병렬 처리와 관련된 내용을 더 자세히 알아보겠습니다. 질문이나 요청사항이 있으시면 댓글로 남겨주세요!


---


이 글의 내용은 GoalKicker.com의 Python Notes for Professionals 책을 참조하였습니다.

댓글