파이썬 네트워크 프로그래밍: 소켓과 고급 프로토콜 마스터하기
파이썬은 네트워크 서비스에 대한 두 가지 수준의 접근을 제공합니다. 낮은 수준에서는 기본 운영 체제의 기본 소켓 지원에 접근할 수 있으며, 이를 통해 연결 지향 및 비연결 프로토콜 모두에 대한 클라이언트와 서버를 구현할 수 있습니다.
파이썬은 또한 FTP, HTTP 등과 같은 특정 애플리케이션 수준 네트워크 프로토콜에 대한 높은 수준의 접근을 제공하는 라이브러리를 가지고 있습니다.
이 장에서는 네트워킹에서 가장 유명한 개념인 소켓 프로그래밍에 대한 이해를 제공합니다.
소켓이란?
소켓은 양방향 통신 채널의 끝점입니다. 소켓은 프로세스 내부, 같은 머신의 프로세스 간, 또는 다른 대륙의 프로세스 간에 통신할 수 있습니다.
소켓은 다양한 채널 유형으로 구현될 수 있습니다: Unix 도메인 소켓, TCP, UDP 등. socket 라이브러리는 일반적인 전송을 처리하기 위한 특정 클래스와 나머지를 처리하기 위한 일반 인터페이스를 제공합니다.
소켓에는 고유한 용어가 있습니다.
| 번호 |
용어 및 설명 |
| 1 |
Domain 전송 메커니즘으로 사용되는 프로토콜 패밀리. 이 값들은 AF_INET, PF_INET, PF_UNIX, PF_X25 등과 같은 상수입니다. |
| 2 |
type 두 끝점 간의 통신 유형. 일반적으로 연결 지향 프로토콜은 SOCK_STREAM, 비연결 프로토콜은 SOCK_DGRAM. |
| 3 |
protocol 일반적으로 0이며, 도메인과 유형 내에서 프로토콜의 변형을 식별하는 데 사용될 수 있습니다. |
| 4 |
hostname 네트워크 인터페이스의 식별자
호스트 이름, 점으로 구분된 4중 주소, 또는 콜론(및 가능하면 점) 표기법의 IPv6 주소일 수 있는 문자열
INADDR_BROADCAST 주소를 지정하는 문자열 "<broadcast>"
INADDR_ANY를 지정하는 빈 문자열
호스트 바이트 순서의 이진 주소로 해석되는 정수
|
| 5 |
port 각 서버는 하나 이상의 포트에서 클라이언트 호출을 대기합니다. 포트는 고정 포트 번호, 포트 번호를 포함하는 문자열, 또는 서비스 이름일 수 있습니다. |
socket 모듈
소켓을 생성하려면 socket 모듈에서 사용 가능한 socket.socket() 함수를 사용해야 합니다. 일반적인 구문은 다음과 같습니다.
s = socket.socket(socket_family, socket_type, protocol=0)
매개변수 설명은 다음과 같습니다.
socket_family - 앞서 설명한 대로 AF_UNIX 또는 AF_INET입니다.
socket_type - SOCK_STREAM 또는 SOCK_DGRAM입니다.
protocol - 보통 생략하며 기본값은 0입니다.
socket 객체를 얻으면 클라이언트 또는 서버 프로그램을 만드는 데 필요한 함수를 사용할 수 있습니다. 다음은 필요한 함수 목록입니다.
서버 소켓 메서드
| 번호 |
메서드 및 설명 |
| 1 |
s.bind() 주소(호스트명, 포트 번호 쌍)를 소켓에 바인딩합니다. |
| 2 |
s.listen() TCP 리스너를 설정하고 시작합니다. |
| 3 |
s.accept() TCP 클라이언트 연결을 수동으로 수락하며, 연결이 도착할 때까지 대기(블로킹)합니다. |
클라이언트 소켓 메서드
| 번호 |
메서드 및 설명 |
| 1 |
s.connect() TCP 서버 연결을 능동적으로 시작합니다. |
일반 소켓 메서드
| 번호 |
메서드 및 설명 |
| 1 |
s.recv() TCP 메시지 수신 |
| 2 |
s.send() TCP 메시지 전송 |
| 3 |
s.recvfrom() UDP 메시지 수신 |
| 4 |
s.sendto() UDP 메시지 전송 |
| 5 |
s.close() 소켓 닫기 |
| 6 |
socket.gethostname() 호스트명 반환 |
간단한 서버
인터넷 서버를 작성하려면 socket 모듈에서 사용 가능한 socket 함수를 사용하여 소켓 객체를 생성합니다. 소켓 객체는 다른 함수를 호출하여 소켓 서버를 설정하는 데 사용됩니다.
이제 bind(hostname, port) 함수를 호출하여 주어진 호스트에서 서비스용 port를 지정합니다.
다음으로 반환된 객체의 accept 메서드를 호출합니다. 이 메서드는 지정한 포트에 클라이언트가 연결될 때까지 대기한 다음, 해당 클라이언트와의 연결을 나타내는 connection 객체를 반환합니다.
#!/usr/bin/python
# server.py 파일
import socket # 소켓 모듈 임포트
s = socket.socket() # 소켓 객체 생성
host = socket.gethostname() # 로컬 머신 이름 가져오기
port = 12345 # 서비스용 포트 예약
s.bind((host, port)) # 포트에 바인딩
s.listen(5) # 클라이언트 연결 대기
while True:
c, addr = s.accept() # 클라이언트와 연결 설정
print('Got connection from', addr)
c.send('Thank you for connecting')
c.close() # 연결 닫기
간단한 클라이언트
주어진 포트 12345와 호스트에 연결을 여는 매우 간단한 클라이언트 프로그램을 작성해 보겠습니다. 파이썬의 socket 모듈 함수를 사용하여 소켓 클라이언트를 만드는 것은 매우 간단합니다.
socket.connect(hostname, port)는 hostname의 port에 TCP 연결을 엽니다. 소켓이 열리면 다른 IO 객체처럼 읽을 수 있습니다. 완료되면 파일을 닫듯이 닫아야 합니다.
다음 코드는 주어진 호스트와 포트에 연결하고, 소켓에서 사용 가능한 데이터를 읽은 다음 종료하는 매우 간단한 클라이언트입니다.
#!/usr/bin/python
# client.py 파일
import socket # 소켓 모듈 임포트
s = socket.socket() # 소켓 객체 생성
host = socket.gethostname() # 로컬 머신 이름 가져오기
port = 12345 # 서비스용 포트 예약
s.connect((host, port))
print(s.recv(1024))
s.close() # 완료되면 소켓 닫기
이제 server.py를 백그라운드에서 실행한 다음 위 client.py를 실행하여 결과를 확인하세요.
# 다음은 백그라운드에서 서버를 시작합니다.
$ python server.py &
# 서버가 시작되면 클라이언트를 다음과 같이 실행:
$ python client.py
이렇게 하면 다음과 같은 결과가 나옵니다.
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
파이썬 인터넷 모듈
파이썬 네트워크/인터넷 프로그래밍에서 중요한 모듈 목록입니다.
| 프로토콜 |
일반 기능 |
포트 번호 |
파이썬 모듈 |
| HTTP |
웹 페이지 |
80 |
httplib, urllib, xmlrpclib |
| NNTP |
유즈넷 뉴스 |
119 |
nntplib |
| FTP |
파일 전송 |
20 |
ftplib, urllib |
| SMTP |
이메일 발송 |
25 |
smtplib |
| POP3 |
이메일 수신 |
110 |
poplib |
| IMAP4 |
이메일 수신 |
143 |
imaplib |
| Telnet |
명령줄 |
23 |
telnetlib |
| Gopher |
문서 전송 |
70 |
gopherlib, urllib |
위에서 언급한 모든 라이브러리를 확인하여 FTP, SMTP, POP, IMAP 프로토콜 작업에 활용하세요.
추가 학습 자료
이것은 소켓 프로그래밍의 빠른 시작이었습니다. 방대한 주제입니다. 더 자세한 내용을 찾으려면 다음 링크를 참조하는 것이 좋습니다.