質問

ツイストして実装されたサーバーとクライアント間のデータを転送しようとしています。私が知っている限りでは、self.transport.write([data])を使用すると、データが文字列の場合にのみ機能します。他のタイプのオブジェクトを送信できる他の方法はありますか?ありがとうございました!

役に立ちましたか?

解決

ソケットキャリーバイトそれが彼らが運ぶ唯一の種類のものです。 TCP接続の任意の2つのエンドポイントは、バイトのみを互いに伝達できます。

バイトは、すべてのコミュニケーションの形式で最も有用なデータ構造ではありません。このバイト輸送の上には、バイトのフォーマットと解釈のためのスキームを発明します。これらはプロトコルです。

Twistedプロトコルをクラスとして表し、Almsotは常に特定のスキームを実装するtwisted.internet.protocol.Protocolのサブクラスを表します。

これらのクラスには、純粋なバイトではないものを純粋なバイトのものに変える方法があります。たとえば、twisted.protocols.basic.NetstringReceiverは、 NetString Protocol の実装です。特定のバイト数をバイト数に変換し、バイト数とバイト自体の両方を表します。これはかなり微妙なプロトコルであるため、バイト数が伝えられる必要がある情報であることが即座に明らかではないので。

これらのクラスは、ネットワークから受信したバイトを、それらが実装するプロトコルに従って、それらが実装するプロトコルに従って、結果として得られる情報をより構造化されたものに変えるバイトを解釈します。 dataReceivedは、長さ情報を使用してネットワークから正しいバイト数を承認し、それらを単一のPython GenerAcodeTagCodeインスタンスとしてNetstringReceiverコールバックに配信します。

他のプロトコルはstringReceivedを超えています。たとえば、strには、FTPプロトコルの実装が含まれています。 FTPは、ソケット(または実際には複数のソケット)を介してファイルリストとファイルを渡すことを目的としたプロトコルです。 NetstringReceiverは、ソケットを介した電子メールを転送するためのプロトコルを実装しています。

多くの異なるプロトコルがあり、あなたがしたいと思うかもしれないさまざまなことがあるので、たくさんの異なるプロトコルがあります。あなたがしようとしていることを正確に何に依存して、おそらくバイトとの間で変換する方法は、物事をより簡単か速くまたはより堅牢にしています(そしてそれ以上)。そのため、一般的なケースに最適な単一のプロトコルはありません。オブジェクトはさまざまな形をとることができるので、「オブジェクトの送信」の場合が含まれており、それらを送信したいさまざまな理由がある可能性があるため、たくさんの異なる方法がある可能性があり、必要なオブジェクトの突然変異のようなものを処理したいと思うかもしれません。以前に送信されたなど。

あなたはおそらくあなたが必要などんなコミュニケーションを考えることを少し過ごしたいと思うでしょう。これは、コミュニケーションを実行するために選択するプロトコルに関する特定のことを提案する必要があります。

たとえば、接続の反対側に存在するPythonオブジェクトのメソッドを呼び出すことができる場合は、ツイストスプレッドは面白いかもしれません。

代わりにクロス言語が欲しい場合は、整数、文字列、リスト、リスト、次に XML-RPC ツイストハウツー)より良いフィットする。

XML-RPCよりもスペース効率が高いプロトコルが必要な場合は、より複雑な型のシリアル化をサポートし、 AMP が適切である場合があります。

とリストが続きます。 :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top