私の状況
シリアル化され、base64 にエンコードされた大きなオブジェクトを接続経由で送信する TCP ネットワーク プログラムがあります。私はクライアント ライブラリとサーバー ライブラリを作成しましたが、どちらも と を使用NetworkStream's
Begin/EndRead
していBegin/EndWrite
ます。私が使用している(非常に単純化されたバージョンの)コードは次のとおりです。
サーバーの場合:
var Server = new TcpServer(/* network stuffs */);
Server.Connect();
Server.OnClientConnect += new ClientConnectEventHandler(Server_OnClientConnect);
void Server_OnClientConnect()
{
LargeObject obj = CalculateLotsOfBoringStuff();
Server.Write(obj.SerializeAndEncodeBase64());
}
次に、クライアント:
var Client = new TcpClient(/* more network stuffs */);
Client.Connect();
Client.OnMessageFromServer += new MessageEventHandler(Client_OnMessageFromServer);
void Client_OnMessageFromServer(MessageEventArgs mea)
{
DoSomethingWithLargeObject(mea.Data.DecodeBase64AndDeserialize());
}
クライアント ライブラリには、を介してデータを文字列として渡すNetworkStream.BeginRead
イベントをトリガーするコールバック メソッドがあります。OnMessageFromServer
MessageEventArgs
私の問題
ただし、を介して大量のデータを受信BeginRead/EndRead
すると、複数のメッセージに断片化されているように見えます。EG これは長いメッセージのふりをします:
"This is a really long message except not because it's for explanatory purposes."
それが本当に長いメッセージだった場合、Client_OnMessageFromServer
呼び出される可能性があります...「長いメッセージ」の断片化された部分で3回言ってください:
"This is a really long messa"
"ge except not because it's for explanatory purpos"
"es."
すぅぅぅぅ……深呼吸
Begin/EndWrite
への 1 回の呼び出しですべてを 1 つに送信して受信するには、どのような方法が最適でしょうClient_OnMessageFromServer
か?