Учебники

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

Python предоставляет два уровня доступа к сетевым сервисам. На низком уровне вы можете получить доступ к базовой поддержке сокетов в базовой операционной системе, которая позволяет реализовывать клиенты и серверы как для протоколов, ориентированных на соединение, так и для протоколов без установления соединения.

В Python также есть библиотеки, которые предоставляют высокоуровневый доступ к определенным сетевым протоколам прикладного уровня, таким как FTP, HTTP и так далее.

Эта глава дает вам понимание самой известной концепции в сети — Socket Programming.

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

Сокеты являются конечными точками двунаправленного канала связи. Сокеты могут связываться внутри процесса, между процессами на одной машине или между процессами на разных континентах.

Сокеты могут быть реализованы для нескольких различных типов каналов: доменные сокеты Unix, TCP, UDP и т. Д. Библиотека сокетов предоставляет специальные классы для обработки общих транспортов, а также универсальный интерфейс для обработки остальных.

Сокеты имеют свой собственный словарь —

Sr.No. Срок и описание
1

домен

Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

2

тип

Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения.

3

протокол

Обычно ноль, это может использоваться для идентификации варианта протокола в домене и типе.

4

имя хоста

Идентификатор сетевого интерфейса —

  • Строка, которая может быть именем хоста, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной) нотации.

  • Строка «<broadcast>», которая указывает адрес INADDR_BROADCAST.

  • Строка нулевой длины, которая указывает INADDR_ANY, или

  • Целое число, интерпретируемое как двоичный адрес в порядке байтов хоста.

5

порт

Каждый сервер прослушивает клиентов, звонящих на один или несколько портов. Порт может быть номером порта Fixnum, строкой с номером порта или названием службы.

домен

Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

тип

Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения.

протокол

Обычно ноль, это может использоваться для идентификации варианта протокола в домене и типе.

имя хоста

Идентификатор сетевого интерфейса —

Строка, которая может быть именем хоста, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной) нотации.

Строка «<broadcast>», которая указывает адрес INADDR_BROADCAST.

Строка нулевой длины, которая указывает INADDR_ANY, или

Целое число, интерпретируемое как двоичный адрес в порядке байтов хоста.

порт

Каждый сервер прослушивает клиентов, звонящих на один или несколько портов. Порт может быть номером порта Fixnum, строкой с номером порта или названием службы.

Модуль розетки

Чтобы создать сокет, вы должны использовать функцию socket.socket (), доступную в модуле сокета, который имеет общий синтаксис —

s = socket.socket (socket_family, socket_type, protocol = 0)

Вот описание параметров —

  • socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

  • socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.

  • протокол — обычно не указывается, по умолчанию 0.

socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.

протокол — обычно не указывается, по умолчанию 0.

Если у вас есть объект сокета , вы можете использовать необходимые функции для создания вашей клиентской или серверной программы. Ниже приведен список необходимых функций —

Методы сокета сервера

Sr.No. Метод и описание
1

s.bind ()

Этот метод привязывает адрес (имя хоста, пара номеров портов) к сокету.

2

s.listen ()

Этот метод устанавливает и запускает прослушиватель TCP.

3

s.accept ()

Это пассивно принимает TCP-клиентское соединение, ожидая, пока соединение не будет установлено (блокируется).

s.bind ()

Этот метод привязывает адрес (имя хоста, пара номеров портов) к сокету.

s.listen ()

Этот метод устанавливает и запускает прослушиватель TCP.

s.accept ()

Это пассивно принимает TCP-клиентское соединение, ожидая, пока соединение не будет установлено (блокируется).

Методы клиентских сокетов

Sr.No. Метод и описание
1

s.connect ()

Этот метод активно инициирует подключение к серверу TCP.

s.connect ()

Этот метод активно инициирует подключение к серверу TCP.

Общие методы сокетов

Sr.No. Метод и описание
1

s.recv ()

Этот метод получает сообщение TCP

2

s.send ()

Этот метод передает сообщение TCP

3

s.recvfrom ()

Этот метод получает сообщение UDP

4

s.sendto ()

Этот метод передает сообщение UDP

5

s.close ()

Этот метод закрывает сокет

6

socket.gethostname ()

Возвращает имя хоста.

s.recv ()

Этот метод получает сообщение TCP

s.send ()

Этот метод передает сообщение TCP

s.recvfrom ()

Этот метод получает сообщение UDP

s.sendto ()

Этот метод передает сообщение UDP

s.close ()

Этот метод закрывает сокет

socket.gethostname ()

Возвращает имя хоста.

Простой сервер

Для написания интернет-серверов мы используем функцию сокета, доступную в модуле сокета, для создания объекта сокета. Затем объект сокета используется для вызова других функций для настройки сервера сокетов.

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

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

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

Простой клиент

Давайте напишем очень простую клиентскую программу, которая открывает соединение с данным портом 12345 и данным хостом. Создать сокет-клиент очень просто с помощью функции модуля сокетов Python.

Socket.connect (имя хоста, порт) открывает TCP-соединение с именем хоста на порту . Когда у вас есть открытый сокет, вы можете читать из него, как любой объект ввода-вывода. Когда закончите, не забудьте закрыть его, как вы бы закрыли файл.

пример

Следующий код представляет собой очень простой клиент, который подключается к данному хосту и порту, читает все доступные данные из сокета и затем завершает работу.

#!/usr/bin/python3           # This is client.py file

import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999

# connection to hostname on the port.
s.connect((host, port))                               

# Receive no more than 1024 bytes
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

Теперь запустите этот server.py в фоновом режиме, а затем запустите вышеуказанный client.py, чтобы увидеть результат.

# Following would start a server in background.
$ python server.py & 

# Once server is started run client as follows:
$ python client.py

Выход

Это даст следующий результат —

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting

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

Список некоторых важных модулей в Python Network / Интернет-программировании приведен ниже —

протокол Общая функция Порт № Модуль Python
HTTP интернет страницы 80 httplib, urllib, xmlrpclib
NNTP Новости Usenet 119 nntplib
FTP Передача файлов 20 ftplib, urllib
SMTP Отправка электронной почты 25 smtplib
POP3 Получение электронной почты 110 poplib
IMAP4 Получение электронной почты 143 imaplib
Telnet Командные строки 23 telnetlib
суслик Передача документов 70 суслик, урлиб

Пожалуйста, проверьте все библиотеки, упомянутые выше, для работы с протоколами FTP, SMTP, POP и IMAP.

Дальнейшие чтения

Это было быстрое начало с программированием сокетов. Это обширная тема. Рекомендуется перейти по следующей ссылке, чтобы найти более подробную информацию —

Unix Socket Программирование .

Python Socket Library и модули .