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 책을 참조하였습니다.
댓글
댓글 쓰기