Сетевое программирование на 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объект, указывающий, что он подключен к клиенту.
Полный код приведён ниже:
Пример
Клиент
Далее напишем простой пример клиента для подключения к сервису, созданному выше. Номер порта — 12345.
socket.connect(hostname, port )метод открывает TCP-соединение с хостомhostnameи портомportсервера. После подключения мы можем получать данные от сервера. Не забудьте закрыть соединение после завершения операций.
Полный код приведён ниже:
Пример
Теперь откроем два терминала. В первом терминале запустите файл server.py:
$ python server.py
Во втором терминале запустите файл client.py:
$ python client.py 欢迎访问Example!
На этом этапе, если мы снова откроем первый терминал, мы увидим следующий вывод:
连接地址: ('192.168.0.118', 62461)
Интернет-модули Python
Ниже перечислены некоторые важные модули для сетевого программирования на Python:
| Протокол | Функция/Назначение | Номер порта | Модуль Python |
|---|---|---|---|
| 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 Socket Library and Modules。
Другие расширения.