时间:2019-01-17 标签:c#TcpListenerasyncBinaryFormatter.Deserialize

标签 c# tcpclient networkstream tcplistener

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

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

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

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

感谢帮助

最佳答案

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

这个:

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

关于时间:2019-01-17 标签:c#TcpListenerasyncBinaryFormatter.Deserialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10437023/

相关文章:

java - 保证TCP客户端和服务器之间不丢包

C# 为什么 "Flush"不强制字节通过网络流传输?

C#按原样获取一个tcp数据包数据

c# - 强制转换 C# 参数?

c# - 带有异步初始化的 Lazy<Task<T>>

sockets - Spring Integration TCP-什么是完​​全关闭监听套接字的好方法

networkstream - B类网络中每个子网的主机数计算

c# - BeginRead 内存不足异常

c# - 如何选择 List<List<keyvaluepair<string,double>>> 中的键值对列表并修改它们的值? C#

c# - 为什么c#不能计算数学函数的精确值