我的背景
我有一个 TCP 网络程序,它通过连接发送已序列化并编码为 base64 的大型对象。我编写了一个客户端库和一个服务器库,它们都使用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
可能会被称为......说三遍“长消息”的碎片部分:
"This is a really long messa"
"ge except not because it's for explanatory purpos"
"es."
呜呜呜……深呼吸
将所有内容通过一个发送到Begin/EndWrite
一个电话即可接收的最佳方式是Client_OnMessageFromServer
什么?