отправка данных между сервером и клиентом в витой - PullRequest
3 голосов
/ 14 июля 2010

Я пытаюсь передать данные между сервером и клиентом, реализованным с использованием витой.Насколько я знаю, использование self.transport.write ([data]) будет работать, только если data является строкой.Есть ли другой способ отправить объект другого типа?Спасибо!

1 Ответ

7 голосов
/ 14 июля 2010

Сокеты переносят байты. Это единственная вещь, которую они носят. Любые две конечные точки соединения TCP могут передавать только байты друг другу.

Байты - не самая полезная структура данных для каждой формы связи. Итак, помимо этого байтового транспорта, мы изобретаем схемы для форматирования и интерпретации байтов. Это протоколы.

Twisted представляет протоколы как классы, almsot всегда подклассы twisted.internet.protocol.Protocol, которые реализуют конкретную схему.

В этих классах есть методы для преобразования чего-то, что не является чистыми байтами, во что-то, что является чистыми байтами. Например, twisted.protocols.basic.NetstringReceiver является реализацией протокола *1000* netstring . Он превращает определенное количество байтов в байты, которые представляют как количество байтов, так и сами байты. Это довольно тонкий протокол, поскольку не сразу видно, что количество байтов является информацией, которую также необходимо передать.

Эти классы также интерпретируют байты, полученные из сети, в своем методе dataReceived в соответствии с протоколом, который они реализуют, и превращают полученную информацию в нечто более структурированное. NetstringReceiver использует информацию о длине, чтобы принять точное количество байтов из сети, а затем доставить их в свой обратный вызов stringReceived в виде отдельного экземпляра Python str.

Другие протоколы делают больше, чем NetstringReceiver. Например, twisted.protocols.ftp включает реализацию протокола FTP. FTP - это протокол, предназначенный для передачи списков файлов и файлов через сокет (или несколько сокетов, на самом деле). twisted.mail.pop3 реализует POP3, протокол для передачи электронной почты через сокеты.

Существует множество разных протоколов, потому что вы можете захотеть сделать много разных вещей. В зависимости от того, что именно вы пытаетесь сделать, возможно, существуют разные способы преобразования в байты и из них, чтобы упростить, ускорить или сделать их более надежными (и т. Д.). Так что нет единого протокола, который идеально подходит для общего случая. Это включает в себя случай «отправки объекта», так как объекты могут принимать множество различных форм, и может быть много разных причин, по которым вы хотите их отправлять, и множество разных способов, с помощью которых вы можете обрабатывать такие вещи, как мутация объекта, который вы бы хотели ранее отправлено и т. д.

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

Например, если вы хотите иметь возможность вызывать методы для объектов Python, которые существуют на другой стороне соединения, тогда Twisted Spread может быть интересным.

Если вам нужно что-то межъязыковое, и вам нужно только передать простые типы, такие как целые числа, строки и списки, тогда XML-RPC ( Twisted How-To ) может быть лучше подходит.

Если вам нужен протокол, который более экономичен, чем XML-RPC, и поддерживает сериализацию более сложных типов, тогда AMP может быть более подходящим.

И этот список можно продолжить. :)

...