Модуль
socket в Python
Сокет - это позволяет соединяться между процессами, даже если они запущены на разных компьютерах. Создать его - это как создать розетку (сервер, или принимающая сторона) , также можно его создавать и на отправляющей стороне (Клиент) - это как вилка(штепсель), которую втыкаем в розетку.
Этим сегодня и займемся...
Как видно на картинке и подытожим основные функции Api данного модуля:
- socket()
- bind()
- listen()
- accept()
- connect()
- connect_ex()
- send()
- recv()
- close()
1. Сначала сервер инициализирует сокет и готовиться к прослушиваниюsocket()
bind()
listen()
accept()
2. Далее идет соединение и обмен информацией с клиентомconnect()
connect_ex()
send()
recv()
3. Закрываем сокетclose()
Например, создадим Server
import socket
HOST = '127.0.0.1'
PORT = 1983
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
Расшифруем:
Для начала нужно понимать почему используется оператор
withстрочка
socket.socket(socket.AF_INET, socket.SOCK_STREAM) - инициализирует сокет,
где:
AF_INET - сети ip-v4
SOCK_STREAM - показывает тип соединения через TCP
s.bind((HOST, PORT)) - связывает сокет с заданными выше хостом и портами, тут задается
кортеж , первый параметр тут строка!
s.listen() - блокирует и ждет прослушку. Блокировке подвергается определенная очередь, которая задается цифрой в скобках, например s.listen(5) - 5 соединений встают в очередь и по очереди начнут слушать. Если не задать - то будет по умолчанию, часто ставят 1.
conn, addr = s.accept()
s.accept() - сокет устанавливается в режим ожидания прослушки / как клиент законнектился, то возвращает кортеж с (host, port) для IP-v4
После получения (host, port) от s.accept(), в бесконечном цикле while
data = conn.recv(1024) - получается информация при помощи метода recv (ограниченным объемом в 1024 байт)
и
conn.sendall(data) - отсылается обратно
если нет больше пакетов для отправки, оператор with сам закрывает сокет, без указания команды s.close() - в этом его и удобство.
Скрипт Клиента (тот, кто хочет подключиться)Он чуть проще
import socket
HOST = '127.0.0.1'
PORT = 1983
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
тут все уже понятно:
1) инициализируется сокет
2) отправляется информация
3) s.sendall(b'Hello, world') - получается и буква b - необходима в Python3