2

私は本当に単純な TcpListener + TcpClient slient-server アプリケーションを持っています。着信接続を非同期で受け入れます。次に、ネットワーク ストリームからデータを読み取ります。

このコードを新しいスレッドで実行します。しかし、クライアントごとに新しいスレッドを実行する必要があります...

while (true)
    (MyCoreMessage)BinaryFormatter.Deserialize(TcpClient.GetStream())

ネットワークストリームからオブジェクトをデシリアライズする (簡単でシンプルな) 非同期の方法はありますか? クライアントごとに新しいスレッドを作成していません...

手伝ってくれてありがとう

4

1 に答える 1

2

データの前に length-prefix を付け (たとえば、network-byte-order 4 バイト)、この長さを最初に読み取ることを強くお勧めします。次に、次のフレームで予想されるデータ量がわかるので、非同期読み取りを使用してその量のデータをバッファリングします (サイズがそれほど大きくないと仮定します)。データのバッファリング (非同期) が終了したら、MemoryStreamなどを使用して通常どおり逆シリアル化できます。

これ:

  • 適切なフレーミングを可能にする
  • 長さをサニティチェックできます
  • すべてのネットワークアクセスを非同期として実行できます
  • 重要なデータがあることがわかっている場合にのみ、デシリアライザーを含めることができます
于 2012-05-03T18:21:12.940 に答える