Python 네트워크 프로그래밍


Python은 네트워크 서비스에 대한 두 가지 수준의 액세스를 제공합니다. :

  • 저수준 네트워크 서비스는 표준 BSD 소켓 API를 제공하고 기본 운영 체제 소켓 인터페이스의 모든 메서드에 액세스할 수 있는 기본 소켓을 지원합니다.

  • 네트워크 서버 개발을 단순화하기 위해 서버 센터 클래스를 제공하는 고급 네트워크 서비스 모듈인 SocketServer입니다.


소켓이란?

소켓은 "소켓"이라고도 합니다. 애플리케이션은 일반적으로 "소켓"을 통해 네트워크에 요청하거나 응답합니다. 요청은 통신을 가능하게 합니다. 호스트 간 또는 컴퓨터의 프로세스 간.


socket() 함수

Python에서는 소켓을 생성하기 위해 소켓() 함수를 사용합니다. 구문 형식은 다음과 같습니다.

socket.socket([family[, type[, proto]]])

매개변수

  • 패밀리: 소켓 패밀리는 AF_UNIX 또는 AF_INET일 수 있습니다

  • 유형: 소켓 유형은 연결 지향 또는 비연결로 나눌 수 있습니다SOCK_STREAM 또는 SOCK_DGRAM

  • 프로토콜: 일반적으로 채워지지 않은 상태로 유지되며 기본값은 0입니다.

소켓 객체(내장) 방식

함수설명
서버측 소켓
s.bind()소켓에 주소(호스트, 포트)를 바인드합니다. 아래 AF_INET에서, 주소는 튜플(호스트, 포트) 형식으로 표현됩니다.
s.listen()TCP 수신을 시작합니다. 백로그는 운영 체제가 연결을 거부하기 전에 일시 중단할 수 있는 최대 연결 수를 지정합니다. 이 값은 1 이상이어야 하며 대부분의 응용 프로그램에서는 5가 적합합니다.
s.accept() 수동적으로 TCP 클라이언트 연결 허용, (차단) 연결 도착 대기
클라이언트 소켓
s.connect()는 TCP 서버 연결을 적극적으로 초기화합니다. 일반적으로 주소 형식은 튜플(호스트 이름, 포트)입니다. 연결 오류가 발생하면 소켓.오류 오류가 반환됩니다.
s.connect_ex()오류 발생 시 예외를 발생시키지 않고 오류 코드를 반환하는 connect() 함수의 확장 버전
공용 소켓 함수
s.recv()TCP 데이터를 받아 문자열 형태로 반환하고, bufsize는 최대 데이터 양을 지정합니다. 플래그는 메시지에 대한 추가 정보를 제공하며 일반적으로 무시할 수 있습니다.
s.send()TCP 데이터를 문자열로 연결된 소켓으로 보냅니다. 반환 값은 보낼 바이트 수이며 문자열의 바이트 크기보다 작을 수 있습니다.
s.sendall()TCP 데이터를 완전하게 전송, TCP 데이터를 완전하게 전송합니다. 연결된 소켓에 문자열로 데이터를 보내지만 반환되기 전에 모든 데이터를 보내려고 시도합니다. 성공하면 None을 반환하고, 실패하면 예외를 발생시킵니다.
s.recvform()recv()와 유사하게 UDP 데이터를 수신하지만 반환 값은 (데이터, 주소)입니다. 여기서 data는 수신된 데이터를 포함하는 문자열이고, address는 데이터가 전송되는 소켓 주소입니다.
s.sendto() UDP 데이터를 소켓으로 보냅니다. 주소는 (ipaddr, port) 형식의 튜플이며 원격 주소를 지정합니다. 반환 값은 전송된 바이트 수입니다.
s.close()소켓 닫기
s.getpeername() 반환 연결 소켓의 원격 주소입니다. 반환 값은 일반적으로 튜플(ipaddr, port)입니다.
s.getsockname()소켓 자체 주소를 반환합니다. 일반적으로 (ipaddr,port)
s.setsockopt(level,optname,value)의 튜플은 주어진 소켓 옵션의 값을 설정합니다.
s.getsockopt(level,optname[.buflen])소켓 옵션의 값을 반환합니다.
s.settimeout(timeout)소켓 작업의 시간 초과 기간을 설정합니다. 시간 초과는 초 단위의 부동 소수점 숫자입니다. 없음 값은 시간 초과 기간이 없음을 의미합니다. 일반적으로 시간 초과는 연결 작업(예: connect())에 사용될 수 있으므로 소켓을 처음 생성할 때 설정해야 합니다.
s.gettimeout()현재 시간 초과 기간의 값을 초 단위로 반환합니다. 시간 초과 기간이 설정되지 않은 경우 없음이 반환됩니다.
s.fileno()소켓의 파일 설명자를 반환합니다.
s.setblocking(flag)플래그가 0이면 소켓을 비차단 모드로 설정하고, 그렇지 않으면 소켓을 차단 모드(기본값)로 설정합니다. 비차단 모드에서, recv()를 호출하여 데이터를 찾을 수 없거나 send() 호출이 데이터를 즉시 보낼 수 없는 경우,socket.error 예외가 발생합니다.
s.makefile()소켓과 관련된 파일을 생성합니다.

간단한 예

서버

소켓 객체를 생성하기 위해 소켓 모듈의 소켓 함수를 사용합니다. 소켓 객체는 다른 함수를 호출하여 소켓 서비스를 설정할 수 있습니다.

이제 bind(hostname, port) 함수를 호출하여 서비스의 port(port)를 지정할 수 있습니다.

다음으로 소켓 개체의 accept 메서드를 호출합니다. 이 메서드는 클라이언트의 연결을 기다리고 connection 개체를 반환하여 클라이언트에 연결되었음을 나타냅니다.

완전한 코드는 다음과 같습니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口
s.bind((host, port))        # 绑定端口

s.listen(5)                 # 等待客户端连接
while True:
    c, addr = s.accept()     # 建立客户端连接。
    print '连接地址:', addr
    c.send('欢迎访问php中文网!')
    c.close()                # 关闭连接

Client

다음으로 위에서 만든 서비스에 연결하기 위한 간단한 클라이언트 인스턴스를 작성합니다. 포트 번호는 12345입니다.

socket.connect(hosname, port) 메소드는 호스트 hostname 및 포트 port를 사용하여 서비스 공급자에 대한 TCP 연결을 엽니다. 연결한 후에는 서버에서 데이터를 게시할 수 있습니다. 작업이 완료된 후에는 연결을 닫아야 합니다.

전체 코드는 다음과 같습니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:client.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口好

s.connect((host, port))
print s.recv(1024)
s.close()

이제 두 개의 터미널을 열고 첫 번째 터미널은 server.py 파일을 실행합니다.

$ python server.py

두 번째 터미널은 클라이언트를 실행합니다. .py 파일 :

$ python client.py 
欢迎访问php中文网!

다시 열면 첫 번째 터미널이며 다음과 같은 정보 출력이 표시됩니다.

连接地址: ('192.168.0.118', 62461)

Python 인터넷 모듈

다음 Python 네트워크 프로그래밍의 일부 중요한 모듈이 나열되어 있습니다:

프로토콜함수 사용법포트 번호Python 모듈
协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib

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<🎜><🎜><🎜><🎜><🎜 >자세한 내용은 공식 홈페이지의 Python 소켓 라이브러리 및 모듈을 참조하세요. <🎜><🎜>