c#TcpListener async BinaryFormatter.Deserialize

时间:2012-05-03 18:09:52

标签: c# tcpclient networkstream tcplistener

我有非常简单的TcpListener + TcpClient slient-server应用程序。我接受输入异步连接。然后我从网络流中读取数据。

我在新线程中运行此代码。但我必须为每个客户运行新线程......

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

是否有一些(简单而简单的)异步方式从网络流中去除对象的desearialize? 没有创建新线程...

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我强烈建议您在数据前面加上长度前缀(例如,网络字节顺序为4个字节),并首先读取的长度。然后你知道在下一帧中预期有多少数据,所以缓冲区使用异步读取的大量数据(假设大小不是太大)。当您完成缓冲数据(异步),然后后,您可以使用像MemoryStream这样的东西并正常反序列化。

此:

  • 允许适当的框架
  • 允许您理智检查长度
  • 允许您以async
  • 的身份进行所有网络访问
  • 允许您在知道有合理数据时只涉及解串器