195 lines
8.6 KiB
Markdown
195 lines
8.6 KiB
Markdown
# 네트워크
|
|
파이썬은 다양한 네트워크 통신 모듈을 제공하여, 웹 서버 구축, 클라이언트 개발, 데이터 전송 등 다양한 네트워크 관련 작업을 수행할 수 있도록 지원합니다.
|
|
|
|
- socket
|
|
|
|
가장 기본적인 네트워크 통신 모듈입니다.
|
|
TCP/IP 프로토콜을 직접 사용하여 소켓을 생성하고 데이터를 주고받을 수 있습니다.
|
|
저수준 통신을 구현하기 위한 유연성을 제공하지만, 직접 소켓을 관리해야 하는 번거로움이 있습니다
|
|
|
|
- urllib
|
|
|
|
URL을 다루는 모듈로, 웹 페이지를 다운로드하거나 웹 서버에 데이터를 전송하는 기능을 제공합니다.
|
|
requests 모듈보다 기능이 제한적이지만, 표준 라이브러리에 포함되어 있어 별도의 설치 없이 사용할 수 있습니다.
|
|
|
|
- requests
|
|
|
|
HTTP 요청을 간편하게 보내고 응답을 받을 수 있는 모듈입니다.
|
|
웹 API를 호출하거나 웹 페이지를 스크래핑하는 등 다양한 작업에 사용됩니다.
|
|
사용법이 간단하여 초보자도 쉽게 사용할 수 있습니다.
|
|
|
|
- asyncio
|
|
|
|
비동기 I/O를 지원하는 모듈로, 많은 수의 연결을 동시에 처리해야 할 때 유용합니다.
|
|
코루틴을 사용하여 비동기 프로그래밍을 구현할 수 있습니다.
|
|
웹 서버, 채팅 서버 등 대규모 네트워크 애플리케이션 개발에 적합합니다.
|
|
|
|
- aiohttp
|
|
|
|
asyncio 기반의 HTTP 클라이언트/서버 라이브러리입니다.
|
|
비동기 방식으로 HTTP 요청을 보내고 응답을 받을 수 있습니다.
|
|
웹 크롤링, REST API 개발 등에 사용됩니다.
|
|
|
|
- Twisted
|
|
|
|
이벤트 기반 네트워킹 프레임워크로, 대규모 네트워크 서비스 개발에 사용됩니다.
|
|
다양한 프로토콜을 지원하며, 확장성이 뛰어납니다.
|
|
|
|
## socket
|
|
socket 모듈은 파이썬에서 네트워크 통신을 구현하기 위한 가장 기본적인 모듈입니다. TCP/IP 프로토콜을 직접 다루면서, 클라이언트와 서버 간의 데이터 송수신을 가능하게 합니다.
|
|
|
|
* 소켓 생성: 다양한 프로토콜(TCP, UDP 등)과 주소 체계(IPv4, IPv6)를 사용하여 소켓을 생성할 수 있습니다.
|
|
* 소켓 바인딩: 생성된 소켓을 특정 IP 주소와 포트에 바인딩합니다.
|
|
* 소켓 연결: 서버 소켓은 클라이언트의 연결 요청을 수락하고, 클라이언트 소켓은 서버에 연결합니다.
|
|
* 데이터 송수신: 소켓을 통해 데이터를 주고받습니다.
|
|
|
|
### 소켓 프로그래밍의 기본 단계
|
|
1. 소켓 생성: `socket.socket()` 함수를 사용하여 소켓 객체를 생성합니다.
|
|
2. 소켓 바인딩: 서버의 경우 `bind()` 메서드를 사용하여 IP 주소와 포트를 지정합니다.
|
|
3. 리스닝: 서버의 경우 `listen()` 메서드를 사용하여 클라이언트의 연결 요청을 대기합니다.
|
|
4. 접속 수락: 서버의 경우 `accept()` 메서드를 사용하여 클라이언트의 연결을 수락합니다.
|
|
5. 데이터 송수신: `send()` 메서드로 데이터를 보내고, `recv()` 메서드로 데이터를 받습니다.
|
|
6. 소켓 닫기: `close()` 메서드를 사용하여 소켓을 닫습니다.
|
|
|
|
```python
|
|
# 소켓 서버
|
|
import socket
|
|
|
|
HOST = '127.0.0.1' # Standard loopback interface address (localhost)
|
|
PORT = 65432 # Port to listen on (non-privileged ports are > 1023)
|
|
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
s.bind((HOST, PORT))
|
|
s.listen()
|
|
conn, addr = s.accept()
|
|
with conn:
|
|
print('Connected by', addr)
|
|
while True:
|
|
data = conn.recv(1024)
|
|
if not data:
|
|
break
|
|
conn.sendall(data)
|
|
```
|
|
|
|
```python
|
|
# 소켓 클라이언트
|
|
import socket
|
|
|
|
HOST = '127.0.0.1' # The server's hostname or IP address
|
|
PORT = 65432 # The port used by the server
|
|
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
s.connect((HOST, PORT))
|
|
s.sendall(b'Hello, world')
|
|
data = s.recv(1024)
|
|
|
|
print('Received', repr(data))
|
|
```
|
|
|
|
* socket.socket(family, type): 소켓 객체를 생성합니다.
|
|
* family: AF_INET(IPv4), AF_INET6(IPv6) 등
|
|
* type: SOCK_STREAM(TCP), SOCK_DGRAM(UDP) 등
|
|
* bind(address): 소켓을 특정 주소와 포트에 바인딩합니다.
|
|
* listen(backlog): 연결 요청 대기열의 크기를 설정합니다.
|
|
* accept(): 클라이언트의 연결 요청을 수락합니다.
|
|
* connect(address): 서버에 연결합니다.
|
|
* sendall(data): 모든 데이터를 전송합니다.
|
|
* recv(bufsize): 최대 bufsize 바이트의 데이터를 수신합니다.
|
|
* close(): 소켓을 닫습니다.
|
|
|
|
socket 모듈은 네트워크 프로그래밍의 기본을 제공하지만, 직접 소켓을 관리해야 하므로 복잡한 부분이 많습니다. 실제 개발에서는 requests, aiohttp 등 더 상위 레벨의 라이브러리를 사용하여 간편하게 네트워크 통신을 수행하는 경우가 많습니다.
|
|
|
|
## urllib
|
|
urllib 모듈은 파이썬에서 웹 페이지를 다운로드하거나 웹 서버에 데이터를 전송하는 등 웹 관련 작업을 수행하는 데 사용됩니다. 특히, 웹 페이지를 스크래핑하거나 API를 호출하여 데이터를 가져올 때 많이 사용됩니다.
|
|
|
|
* 웹 페이지 다운로드: urlopen() 함수를 사용하여 웹 페이지의 내용을 가져올 수 있습니다.
|
|
* URL 파싱: urlparse 모듈을 사용하여 URL을 구성 요소별로 분해할 수 있습니다.
|
|
* HTTP 요청: request 모듈을 사용하여 다양한 HTTP 메서드(GET, POST 등)를 지원하는 요청을 보낼 수 있습니다.
|
|
* 쿠키 처리: cookielib 모듈을 사용하여 쿠키를 관리할 수 있습니다.
|
|
|
|
```python
|
|
import urllib.request
|
|
|
|
# URL 지정
|
|
url = 'https://www.example.com'
|
|
|
|
# URL 열기
|
|
response = urllib.request.urlopen(url)
|
|
|
|
# HTTP 상태 코드 확인
|
|
print(response.status)
|
|
|
|
# 웹 페이지 내용 읽기
|
|
html = response.read()
|
|
print(html)
|
|
```
|
|
|
|
```python
|
|
import urllib.request
|
|
|
|
url = 'https://api.example.com/data'
|
|
headers = {'User-Agent': 'My Python Script', 'Content-Type': 'application/json'}
|
|
data = b'{"key": "value"}' # 바이트 형태로 데이터 전달
|
|
|
|
req = urllib.request.Request(url, data=data, headers=headers, method='POST')
|
|
|
|
with urllib.request.urlopen(req) as response:
|
|
html = response.read()
|
|
print(html)
|
|
```
|
|
|
|
### urllib.request 모듈의 주요 함수
|
|
* urlopen(url): 지정된 URL을 열고 HTTPResponse 객체를 반환합니다.
|
|
* Request(url, data=None, headers={}): HTTP 요청 객체를 생성합니다.
|
|
* urlretrieve(url, filename): URL의 내용을 로컬 파일로 저장합니다.
|
|
|
|
```python
|
|
import urllib.parse
|
|
|
|
# URL 분해
|
|
url = 'https://www.example.com/search?q=python'
|
|
parsed_url = urllib.parse.urlparse(url)
|
|
|
|
print(parsed_url.scheme) # 출력: https
|
|
print(parsed_url.netloc) # 출력: www.example.com
|
|
print(parsed_url.query) # 출력: q=python
|
|
```
|
|
|
|
urllib 모듈보다 더욱 강력하고 사용하기 편리한 requests 모듈이 있습니다. requests 모듈은 쿠키 처리, 인증, 다양한 HTTP 메서드 지원 등 더 많은 기능을 제공합니다.
|
|
|
|
## requests
|
|
requests 모듈은 파이썬에서 웹 요청을 보내고 응답을 받는 작업을 매우 간편하게 처리할 수 있도록 해주는 강력한 HTTP 라이브러리입니다. urllib 모듈에 비해 더욱 직관적이고 다양한 기능을 제공하여, 웹 스크래핑, API 호출 등 다양한 분야에서 널리 사용됩니다.
|
|
|
|
* 간편한 사용: 직관적인 인터페이스를 제공하여 복잡한 HTTP 요청을 간단하게 처리할 수 있습니다.
|
|
* 다양한 HTTP 메서드 지원: GET, POST, PUT, DELETE 등 다양한 HTTP 메서드를 지원합니다.
|
|
* 자동 추적: 리디렉션을 자동으로 따라가고, 쿠키를 자동으로 처리합니다.
|
|
* JSON 응답 처리: JSON 형식의 응답을 파이썬 객체로 직접 변환해줍니다.
|
|
* 바이너리 데이터 처리: 이미지, 파일 등 바이너리 데이터를 다룰 수 있습니다.
|
|
* 인증: 기본 인증, 다이제스트 인증 등 다양한 인증 방식을 지원합니다.
|
|
|
|
```python
|
|
import requests
|
|
|
|
# GET 요청
|
|
response = requests.get('https://api.example.com/data')
|
|
|
|
# JSON 응답 파싱
|
|
data = response.json()
|
|
|
|
# POST 요청
|
|
response = requests.post('https://api.example.com/data', json={'key': 'value'})
|
|
|
|
# 응답 상태 코드 확인
|
|
print(response.status_code)
|
|
|
|
# 응답 내용 출력
|
|
print(response.text)
|
|
```
|
|
|
|
### 주요 함수
|
|
* requests.get(url, params=None, kwargs): GET 요청을 보냅니다.
|
|
* requests.post(url, data=None, json=None, kwargs): POST 요청을 보냅니다.
|
|
* requests.put(url, data=None, kwargs): PUT 요청을 보냅니다.
|
|
* requests.delete(url, kwargs): DELETE 요청을 보냅니다.
|
|
|