Сетевое программирование на Python

Python предоставляет сетевые сервисы на двух уровнях доступа:

  • Низкоуровневые сетевые сервисы поддерживают базовые сокеты, предоставляя стандартный API BSD Sockets, который может получать доступ ко всем методам интерфейса сокетов базовой операционной системы.
  • Высокоуровневый модуль сетевых сервисов SocketServer предоставляет классы, ориентированные на серверы, которые упрощают разработку сетевых серверов.

Что такое сокет?

Сокет также называют 'socket'. Приложения обычно отправляют запросы в сеть или отвечают на сетевые запросы через 'socket', обеспечивая связь между хостами или между процессами на одном компьютере.


функция socket()

В Python мы используем функцию socket() для создания сокета. Синтаксис следующий:

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

Parameters

  • family: Семейство сокетов может быть AF_UNIX или AF_INET.
  • type: Тип сокета можно разделить в зависимости от того, ориентирован ли он на установление соединения или работает без соединения, на:SOCK_STREAMилиSOCK_DGRAM。
  • protocol: Обычно не заполняется; по умолчанию 0.

Встроенные методы объекта Socket

Функция Описание
Сокеты на стороне сервера
s.bind() Привязывает адрес (host, port) к сокету. В AF_INET адрес представляется в виде кортежа (host, port).
s.listen() Начать прослушивание TCP. backlog задаёт максимальное число соединений, которые операционная система может поставить в очередь, прежде чем начнёт отклонять соединения. Это значение должно быть не менее 1; для большинства приложений достаточно установить его равным 5.
s.accept() Пассивно принимать TCP-соединения клиентов, ожидая (блокируясь) поступления соединения.
Сокеты на стороне клиента
s.connect() Активно инициализировать соединение с TCP-сервером. Обычно address представляет собой кортеж (hostname, port). Если соединение не удаётся, возвращается socket.error.
s.connect_ex() Расширенная версия функции connect(); при ошибке она возвращает код ошибки, а не вызывает исключение.
Функции сокетов общего назначения
s.recv() Принимать данные TCP; данные возвращаются в виде строки. bufsize задаёт максимальный объём принимаемых данных. flag предоставляет дополнительную информацию о сообщении и обычно может игнорироваться.
s.send() Отправка данных TCP. Отправляет данные из string подключённому сокету. Возвращаемое значение — количество отправленных байтов, которое может быть меньше размера string в байтах.
s.sendall() Полная отправка данных TCP. Отправляет данные из string подключённому сокету, но пытается отправить все данные до возврата. Возвращает None при успехе или вызывает исключение при ошибке.
s.recvfrom() Приём данных UDP, аналогично recv(), но возвращаемое значение — (data, address). data — строка, содержащая полученные данные, а address — адрес сокета, отправившего данные.
s.sendto() Отправка данных UDP. Отправляет данные в сокет; address — кортеж вида (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) Устанавливает период тайм-аута для операций с сокетом. timeout — это float в секундах. Значение None означает отсутствие периода тайм-аута. Обычно тайм-аут следует устанавливать при первом создании сокета, поскольку он может использоваться для операций соединения (например, connect()).
s.gettimeout() Возвращает текущее значение тайм-аута в секундах; если период тайм-аута не установлен, возвращает None.
s.fileno() Возвращает файловый дескриптор сокета.
s.setblocking(flag) Если flag равен 0, установите сокет в неблокирующий режим; в противном случае установите сокет в блокирующий режим (по умолчанию). В неблокирующем режиме, если recv() не находит данных или send() не может отправить данные немедленно, будет вызвано исключение socket.error.
s.makefile() Создайте файл, связанный с этим сокетом.

Простой пример

Server

Мы используем функциюsocketмодуля socket для создания объекта сокета. Объект сокета может настроить службу сокета, вызывая другие функции.

Теперь мы можем вызвать функциюbind(hostname, port), чтобы указатьпорт службы.。

Далее мы вызываем методacceptобъекта сокета. Этот метод ожидает подключения клиента и возвращаетconnectionобъект, указывающий, что он подключен к клиенту.

Полный код приведён ниже:

Пример

#!/usr/bin/python # -*- coding: UTF-8 -*- # Имя файла: server.py import socket # Импорт модуля socket s = socket.socket() # Создание объекта сокета host = socket.gethostname() # Получение локального имени хоста port = 12345 # Задать порт s.bind((host, port)) # Привязать порт s.listen(5) # Ожидание подключения клиента while True: c,addr = s.accept() # Установить соединение с клиентом print 'Адрес подключения:', addr c.send('Добро пожаловать в Пример!') c.close() # Закрыть соединение

Клиент

Далее напишем простой пример клиента для подключения к сервису, созданному выше. Номер порта — 12345.

socket.connect(hostname, port )метод открывает TCP-соединение с хостомhostnameи портомportсервера. После подключения мы можем получать данные от сервера. Не забудьте закрыть соединение после завершения операций.

Полный код приведён ниже:

Пример

#!/usr/bin/python # -*- coding: UTF-8 -*- # Имя файла: client.py import socket # Импорт модуля socket s = socket.socket() # Создание объекта сокета host = socket.gethostname() # Получение локального имени хоста port = 12345 # Задать номер порта s.connect((host, port)) print s.recv(1024) s.close()

Теперь откроем два терминала. В первом терминале запустите файл server.py:

$ python server.py

Во втором терминале запустите файл client.py:

$ python client.py 
欢迎访问Example!

На этом этапе, если мы снова откроем первый терминал, мы увидим следующий вывод:

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

Интернет-модули Python

Ниже перечислены некоторые важные модули для сетевого программирования на Python:

ПротоколФункция/НазначениеНомер портаМодуль Python
HTTPВеб-доступ80httplib, urllib, xmlrpclib
NNTPЧтение и публикация новостных статей, обычно называемых "постами".119nntplib
FTPПередача файлов20ftplib, urllib
SMTPОтправка электронной почты25smtplib
POP3Получение электронной почты110poplib
IMAP4Выборка электронной почты143imaplib
TelnetКомандная строка23telnetlib
GopherПоиск информации70gopherlib, urllib

Для получения дополнительной информации обратитесь к официальному веб-сайтуPython Socket Library and Modules。

Другие расширения.