Python - Программирование сокетов
Python предоставляет два уровня доступа к сетевым службам. На низком уровне вы можете получить доступ к базовой поддержке сокетов в базовой операционной системе, что позволяет вам реализовывать клиентов и серверы как для протоколов с установлением соединения, так и без установления соединения.
Python также имеет библиотеки, которые обеспечивают доступ более высокого уровня к определенным сетевым протоколам уровня приложения, таким как FTP, HTTP и т. Д.
Сокеты - это конечные точки двунаправленного канала связи. Сокеты могут обмениваться данными внутри процесса, между процессами на одной машине или между процессами на разных континентах. Мы используем модуль сокетов в Python для создания и использования сокетов.
У сокетов есть свой словарный запас -
Sr.No. | Срок и описание |
---|---|
1 | Domain Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д. |
2 | type Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов с установлением соединения и SOCK_DGRAM для протоколов без установления соединения. |
3 | protocol Обычно ноль, это может использоваться для идентификации варианта протокола в домене и типе. |
4 | hostname Идентификатор сетевого интерфейса -
|
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/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close() # Close the connection
Простой клиент
Давайте напишем очень простую клиентскую программу, которая открывает соединение с заданным портом 12345 и заданным хостом. Создать клиент сокета с помощью функции модуля сокета Python очень просто .
В socket.connect(hosname, port )открывает TCP-соединение с именем хоста на порту . Когда у вас открыт сокет, вы можете читать из него, как любой объект ввода-вывода. Когда закончите, не забудьте закрыть его, как если бы вы закрывали файл.
Следующий код представляет собой очень простой клиент, который подключается к заданному хосту и порту, считывает любые доступные данные из сокета, а затем выходит:
#!/usr/bin/python # This is client.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close # Close the socket when done
Теперь запустите этот 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
Это даст следующий результат -
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
Сокет с общедоступным URL
В приведенном ниже примере мы используем несколько методов из модуля сокета, чтобы найти информацию об адресе сервера и имени хоста.
import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()
Когда мы запускаем указанную выше программу, мы получаем следующий результат -
[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP