.NET中是否有任何基于消息的TCP套接字库?

ota*_*tay 5 .net sockets tcp

当我是套接字编程的新手时,我在编写一个简单的tcp服务器-客户端程序时,发现基于流的api使用起来并不方便。

我的程序很简单:

  1. 客户端连接到服务器
  2. 服务器以不可预期的间隔不断向客户端发送消息
  3. 客户端接收消息并根据消息中包含的数据进行工作

但是,使用基于流的api,我必须:

  • 定义消息定界符/分隔符
  • 使用while循环从流中读取数据
  • 连接所有字节,尝试查找分隔符
  • 如果存在定界符,请分割数据,提取消息

这是很多工作,甚至比我程序的整个逻辑还要多,所以我想知道是否有一个库可以为我做上面的事情,有了这样的库,我可以像这样编程:

// Server
TcpListenerEx server = new TcpListenerEx();
TcpClientEx client = server.Accept();
client.SendMessage(new StringMessage("hello world"));

// Client
TcpClientEx client = new TcpClientEx();
client.Connect("localhost", 8989);
while (true) {
    IMessage message = client.ReadMesage();
    // Do work acording to message
}
Run Code Online (Sandbox Code Playgroud)

任何建议都将受到欢迎,谢谢。

usr*_*usr 2

在字节流中嵌入分隔符并不像看起来那么容易。您必须处理意外包含分隔符的消息。这会导致大量令人讨厌的检测和转义代码。

构建消息的一种非常简单的方法是在前面添加长度前缀。在发送方,您将消息序列化到缓冲区中,然后写入长度,然后写入缓冲区。接收方首先读取4个字节来获取长度。然后它读取正文。

这没有内置到 .NET 中,可能是因为每个二进制协议都略有不同。

所有这些都非常简单,您不太可能找到图书馆。这样的协议只需几十行即可编写。我的建议是自己做。

不过,如果您想构建消息结构,可以使用一个很棒的库:protobuf-net(适用于 .NET 的 Google 协议缓冲区)。它为您提供消息框架,并以非常合理的方式进行序列化。它很好地支持协议版本控制。