サーバーからクライアントに連続して送信された複数のメッセージがクライアントによって同じ順序で受け入れられることは TCP 標準の範囲内ですか (1 つのメッセージのバイトが他のメッセージ内に散らばることはありません)。
3 に答える
TCP は、インオーダー バイト ストリーム配信サービスを提供します。バイトが別の順序で到着することはありませんが、書き込み数は読み取り数と同じである必要はありません。
- バイトが送信された順序とは異なる順序で読み取られることはありません
- 「メッセージ」については何も推測できません。TCP はメッセージを認識せず、バイトのみを認識します (上記を参照)。送信者と受信者の両方が、そのような「メッセージ」を結合して分割できます
@cnicutarに同意します。
オブジェクトをどのように逆シリアル化しますか?問題はそこにあるのではないかと思います。
たとえば、メッセージが次のような場合
ABCD
200ミリ秒後にPQR
。次のように表示される場合があります。
ABC
に続くPQR
- また
ABCDPQR
- または、
AB
その後にCD
続いて、PQ
その後にR
。
基本的に、データを受信する時間に基づいて推測することはできません。
デシリアライズロジックは、バイトストリーム内のオブジェクト境界を認識している必要があります。この情報は、シリアル化ロジックによってストリームにエンコードする必要があります。
Javaを使用している場合は、ObjectInputStream
&を使用できObjectOutputStream
、シリアル化の問題に悩まされることはありません。
J2ME Polishには、他のプラットフォームに非常に簡単に移植できる優れたシリアル化ユーティリティがあります。私自身もライブ環境で使用しています。
TCP はシーケンス番号を使用して、データの各バイトを識別します。シーケンス番号は、各コンピューターから送信されたバイトの順序を識別するため、送信中に断片化、乱れ、またはパケット損失が発生しても、データを順番に再構築できます。