【问题标题】:c# TcpListener async BinaryFormatter.Deserializec# TcpListener async BinaryFormatter.Deserialize
【发布时间】:2012-05-13 07:13:45
【问题描述】:

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

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

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

是否有一些(简单而简单的)异步方法可以从网络流中反序列化对象? 不为每个客户创建新线程...

感谢帮助

【问题讨论】:

  • 单个线程如何跟踪每个流并适当地阻塞?这似乎是一个糟糕的方法。
  • 你所问的对我来说没有意义。无论如何,您不能从多个线程上的单个 NetworkStream 读取?异步与此有什么关系?只需为每个连接打开一个新线程。
  • 对不起。我可能没有准确地表达。问题已更新。

标签: c# tcpclient networkstream tcplistener


【解决方案1】:

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

这个:

  • 允许适当的框架
  • 允许您检查长度
  • 允许您以异步方式进行所有网络访问
  • 仅当您知道自己有敏感数据时才允许使用反序列化器

【讨论】:

  • 好的。非常感谢。我期待着。这将不仅仅是调用“BinaryFormatter.Deserialize()”;)
  • @Marek 是的,它可能会:p
猜你喜欢
  • 2013-10-11
  • 2018-03-21
  • 2016-03-17
  • 2011-10-06
  • 2014-03-16
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多