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

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

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

В этой главе вы познакомитесь с самой известной концепцией сети - программированием сокетов.

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

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

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

У сокетов есть свой словарный запас -

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

domain

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

2

type

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

3

protocol

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

4

hostname

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

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

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

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

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

5

port

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

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

Чтобы создать сокет, вы должны использовать функцию 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.

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

Методы серверных сокетов

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

s.bind()

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

2

s.listen()

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

3

s.accept()

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

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

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

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()

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

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

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

Теперь позвоните в 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(hosname, port )открывает 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 приведен ниже -

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

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

Дополнительная литература

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

  • Программирование сокетов Unix .

  • Библиотека сокетов Python и модули .