Twisted で dataReceived メソッドを実装する場合、パケットが断片化されていることを示す例はないようです。他のすべての言語では、これは手動で実装するものなので、twisted でこれが既に行われているのか、それとも何なのか疑問に思っていました。その場合、パケットに長さヘッダーのプレフィックスを付ける必要がありますか? または、これを手動で行う必要がありますか? もしそうなら、それはどのような方法でしょうか?
3 に答える
dataReceived メソッドでは、不確定な長さの文字列としてデータを取得します。これは、プロトコルのメッセージ全体である場合もあれば、「クライアント」が送信したメッセージの一部である場合もあることを意味します。データを検査して、プロトコル内のメッセージ全体を構成しているかどうかを確認する必要があります。
私は現在、自分のプロジェクトの 1 つで Twisted を使用してプロトコルを実装しており、構造体モジュールを使用してデータをパック/アンパックすることにしました。私が実装しているプロトコルのヘッダー サイズは固定されているため、少なくとも HEADER_SIZE バイトを読み取るまでメッセージを作成しません。メッセージの合計サイズは、このヘッダー データ部分で宣言されます。
プロトコルの一部としてメッセージの長さを定義する必要はないと思いますが、役に立ちます。定義していない場合は、メッセージの開始/終了を決定する特別な区切り文字が必要になります。FIX プロトコルが SOH バイトを使用してフィールドを区切る方法の並べ替え。ただし、メッセージの長さを示す必須フィールドがあります (メッセージ内のフィールド数ではありません)。
TCP を扱うときは、「パケット」の概念をすべて忘れる必要があります。TCP はストリーム プロトコルです。データをストリーミングし、反対側からデータをストリーミングします。データが送信されると、データがすべて正しい順序で到着する限り、必要な数のブロックで到着することが許可されます。他の言語と同様に、長さフィールド、メッセージ タイプ フィールド、または特殊な区切り文字などを使用して、手動で区切りを行う必要があります。
LineReceiver プロトコルを使用することもできます