Python Sockets

Contents
Introduction
Пример

Introduction

Пример

# Нужно принять сообщение типа # name=Sergey&last_name=Ivanov&birthday=1990-10-05 # и вытащить имя, фамилию и ДР # Используем модуль socket: import socket # Создаём сокет sock = socket.socket() # Выбираем хост и порт. # Хост сделаем пустым для большей доступности sock.bind(('', 9090)) # Запускаем режим прослушивания и определяем размер очереди sock.listen(1) # Принимаем подключение с помощью метода accept # accept возвращает кортеж (tuple) с двумя элементами # новый сокет и адрес клента # адрес клиент это тоже кортеж из двух элементов # IP это элемент с индексом 0 (class 'str') conn, addr = sock.accept() print('connected:', addr) client_ip = addr[0] # В my_list мы будем собирать символы по 4 чтобы понять # было два перевода строки или нет my_list = [] # my_decoded_list сделан для подстаховки, чтобы убедиться # что мы не приняли за перевод строки что-то другое # это ещё не реализовано my_decoded_list = [] # i просто считает символы i = 0 while True: symbol = conn.recv(1) # сюда нужно встроить проверку декодируется ли этот символ в принципе или нет # хотя бы try поставить decoded_symbol = symbol.decode('utf-8') my_list += symbol my_decoded_list += decoded_symbol # пока что мы не ожидаем сообщение # нужно дождаться двух переводов строки message_coming = False # поймали два перевода строки if i > 2 and my_list[i] == 10 and my_list[i - 1] == 13 and my_list[i - 2] == 10 and my_list[i - 3] == 13: # теперь мы ждём сообщение message_coming = not message_coming while message_coming == True: # о размере нужно договориться заранее # мы ждём до 2-х килобайт message = conn.recv(2048) # Декодируем из 'b' в 'str' decoded_message = message.decode('utf-8') # Проверяем что сообщение начинается с name, иначе нет смысла с ним # работать дальше if decoded_message[:5] == 'name=': # Разбиваем по разделительному символу & new_list = decoded_message.split('&') new_list_len = len(new_list) # Проверяем, что элемента три if new_list_len == 3: name = new_list[0][5:] last_name_check = new_list[1][:9] if last_name_check == 'last_name': last_name = new_list[1][10:] else: print("Error with last_name name") message_coming = False birthday = new_list[2][span class="lightblue">9:span class="lightblue">-2] print(name) print(last_name) print(birthday) if birthday: birthday_len = len(birthday) if birthday_len != 10: print(f"Error in birthday format. Expected len = 10." f"Actual len = {birthday_len}") # Здесь я шлю данные обратно, # но вообще можно вызывать какую-то функцию и передавать аргументы conn.send(bytes(name, 'utf-8')) conn.send(bytes(last_name, 'utf-8')) conn.send(bytes(birthday, 'utf-8')) conn.send(bytes(client_ip, 'utf-8')) print("OK") message_coming = False else: print(f"message is not full. Expected len = 3." f"Actual len = {new_list_len}") message_coming = False else: print("message is not of correct format") message_coming = False i += 1 if not symbol: break # Закрываем подключение # Как именно закрывется подключение я ещё не разобрался conn.close()

Статьи о Python
Development на Python
Интерактивный режим
Виртуальное окружение
str: строки
\: перенос строки
Списки
Циклы
Методы
Функции
*args **kwargs
enum
Опеределить тип переменной Python
Тестирование с помощью Python
Работа с REST API на Python
Файлы: записать, прочитать, дописать, контекстный менеджер…
Скачать файл по сети
SQLite3: работа с БД
datetime: Date and Time в Python
Selenium + Python
Сложности при работе с Python
DJANGO
Flask
Скрипт для ZPL принтера
subprocess: выполнение bash команд из Python
multiprocessing: несколько процессов одновременно
psutil: cистемные ресурсы
sys.argv: аргументы командной строки
PyCharm: IDE
pydantic: валидация данных
paramiko: SSH из Python
enumerate
json.dumps
Share in social media: