Files
python-examples/doc/20_00_network.md
2025-01-20 02:26:20 +09:00

8.6 KiB

네트워크

파이썬은 다양한 네트워크 통신 모듈을 제공하여, 웹 서버 구축, 클라이언트 개발, 데이터 전송 등 다양한 네트워크 관련 작업을 수행할 수 있도록 지원합니다.

  • 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() 메서드를 사용하여 소켓을 닫습니다.
# 소켓 서버
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)
# 소켓 클라이언트
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 모듈을 사용하여 쿠키를 관리할 수 있습니다.
import urllib.request

# URL 지정
url = 'https://www.example.com'

# URL 열기
response = urllib.request.urlopen(url)

# HTTP 상태 코드 확인
print(response.status)

# 웹 페이지 내용 읽기
html = response.read()
print(html)
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의 내용을 로컬 파일로 저장합니다.
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 형식의 응답을 파이썬 객체로 직접 변환해줍니다.
  • 바이너리 데이터 처리: 이미지, 파일 등 바이너리 데이터를 다룰 수 있습니다.
  • 인증: 기본 인증, 다이제스트 인증 등 다양한 인증 방식을 지원합니다.
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 요청을 보냅니다.