🏠 | 💻 IT | Программирование Code | Python |

Python Sockets

Введение

Содержание статьи
Введение
Пример

Пример

# Нужно принять сообщение типа 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][9:-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. 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. 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
Программирование на Python
Опеределить тип переменной Python
Тестирование с помощью Python
Selenium + Python
Сложности при работе с Python
DJANGO
Flask
Скрипт для ZPL принтера
Виртуальное окружение

Если остались вопросы - смело задавайте их в комментариях.

Поиск по сайту
Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: