Передача строк байтов и объектов

peredacha strok bajtov i obektov Сетевые сценарии

Мы познакомились с методами, которые используются для передачи данных на стороне сервера, но что из себя представляют данные, передаваемые через сокет? Как мы узнали в главе 5, сокеты сами по себе всегда работают со стро ка ми двоичных бай тов, а не с текстом. Для сценариев это означает, что они вынуждены передавать и принимать строки bytes, а не str, хотя вы можете предусмотреть кодирование текста и декодирование в текст с помощью методов str.encode и bytes.decode. Для удовлетворения требований сокетов мы будем использовать в наших сценариях литералы bytes вида b‘…’. В других ситуациях можно использовать модули struct и pickle, автоматически возвращающие строки байтов, благодаря чему отпадает необходимость в выполнении дополнительных операций кодирования/декодирования.

Например, несмотря на то, что модель сокетов ограничивается передачей строк байтов, вы можете отправлять и принимать практически любые объекты Python с помощью стандартного модуля pickle сериализации объектов. Его функции dumps и loads преобразуют объекты Python в строки байтов и обратно, готовые к передаче через сокеты:

>>> import pickle

>>> x = pickle.dumps([99, 100]) # на передающей стороне…

# преобразовать в строку байтов

>  >> x # строка для отправки, возвращается

b’\x80\x03]q\x00(KcKde.’ # методом recv

>  >> pickle.loads(x) # на принимающей стороне…

[99, 100] # преобразовать обратно в объект

Для преобразования простых типов, соответствующих типам в языке C, можно также использовать модуль struct, который обеспечивает необходимую нам возможность преобразования в строку байтов:

>  >> import struct

>  >> x = struct.pack(‘>ii‘, 99, 100) # преобразование данных простых типов

>  >> x # для передачи

b’\x00\x00\x00c\x00\x00\x00d’

>>> struct.unpack(‘>ii’, x)

(99, 100)

Используя подобные преобразования, мы получаем возможность передавать объекты Python через сокеты. За дополнительной информацией о модуле struct обращайтесь к главе 4. Мы уже кратко рассматривали модуль pickle и сериализацию объектов в главе 1, но еще больше об этом модуле и о некоторых ограничениях сериализации объектов мы узнаем в главе 17, когда будем исследовать способы сохранения данных.

В действительности существуют различные способы расширения базовой модели передачи данных через сокеты. Например, подобно тому, как функция open способна обертывать дескрипторы файлов, полученные с помощью функции os.fdopen, о чем рассказывалось в главе 4, метод socket.makefile позволяет обертывать сокеты объектами файлов в текстовом режиме, которые выполняют кодирование и декодирование текста автоматически. Этот метод позволяет в Python 3.X указывать кодировки, отличные от кодировки по умолчанию, и определять параметры преобразования символов конца строки в виде дополнительных аргументов, как при использовании встроенной функции open. Поскольку результат вызова метода socket.makefile имитирует интерфейс файлов, его также можно использовать в вызовах функций модуля pickle, принимающих файлы, для неявной передачи объектов через сокеты. Дополнительные примеры обертывания сокетов объектами файлов будут представлены далее в этой главе.

В наших простых сценариях вся работа выполняется с помощью жестко определенных строк байтов и непосредственных вызовов методов сокетов. Завершив сеанс обмена с данным конкретным клиентом, сервер из примера 12.1 возвращается в свой бесконечный цикл и ждет следующего запроса на соединение от клиента. А теперь двинемся дальше и посмотрим, что происходит по другую сторону барьера.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий