ツイストで実装されたサーバーとクライアント間でデータを転送しようとしています。私の知る限り、self.transport.write([data])の使用は、データが文字列の場合にのみ機能します。他のタイプのオブジェクトを送信する他の方法はありますか?ありがとうございました!
1 に答える
ソケットはバイトを運びます。それは彼らが運ぶ唯一の種類のものです。TCP接続の任意の2つのエンドポイントは、相互にバイトのみを伝達できます。
バイトは、あらゆる形式の通信にとって最も有用なデータ構造ではありません。したがって、このバイトトランスポートに加えて、バイトをフォーマットおよび解釈するためのスキームを発明します。これらはプロトコルです。
Twistedはプロトコルをクラスとして表し、almsotは常にのサブクラスでありtwisted.internet.protocol.Protocol
、特定のスキームを実装します。
これらのクラスには、純粋なバイトではないものを純粋なバイトであるものに変換するためのメソッドがあります。たとえば、twisted.protocols.basic.NetstringReceiver
はnetstringプロトコルの実装です。特定のバイト数を、バイト数とバイト自体の両方を表すバイトに変換します。バイトカウントも伝達する必要のある情報であることがすぐにはわからないため、これはかなり微妙なプロトコルです。
これらのクラスは、実装するプロトコルに従って、ネットワークから受信したバイトをdataReceived
メソッドで解釈し、結果の情報をより構造化されたものに変換します。 NetstringReceiver
長さ情報を使用して、ネットワークから正確に正しいバイト数を受け入れ、それらをstringReceived
単一のPythonstr
インスタンスとしてコールバックに配信します。
他のプロトコルは以上のことを行いますNetstringReceiver
。たとえばtwisted.protocols.ftp
、FTPプロトコルの実装が含まれます。FTPは、ファイルリストとファイルをソケット(または実際には複数のソケット)を介して渡すことを目的としたプロトコルです。 twisted.mail.pop3
ソケットを介して電子メールを転送するためのプロトコルであるPOP3を実装します。
あなたがやりたいと思うかもしれないたくさんの異なったことがあるので、たくさんの異なったプロトコルがあります。何をしようとしているのかによって、バイトとの間で変換を行ったり、バイトから変換したりして、物事をより簡単に、より速く、より堅牢にする(など)方法はおそらく異なります。したがって、一般的なケースに理想的な単一のプロトコルはありません。これには、「オブジェクトの送信」の場合も含まれます。オブジェクトはさまざまな形式をとることができ、送信する理由はさまざまであり、オブジェクトの変更などを処理する方法もさまざまです。以前に送信された、など。
おそらく、どのようなコミュニケーションが必要かを考えるのに少し時間をかけたいと思うでしょう。これは、通信を行うために選択するプロトコルに関する特定のことを示唆しているはずです。
たとえば、接続の反対側に存在するPythonオブジェクトのメソッドを呼び出せるようにする場合は、TwistedSpreadが興味深いかもしれません。
代わりに言語を超えたものが必要で、整数、文字列、リストなどの単純な型のみを伝達する必要がある場合は、XML-RPC(Twisted How-To)の方が適している可能性があります。
XML-RPCよりもスペース効率が高く、より複雑なタイプのシリアル化をサポートするプロトコルが必要な場合は、AMPの方が適している可能性があります。
そして、リストは続きます。:)