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

时间:2012-09-13 08:43:14

标签: .net sockets tcp

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

我的程序很简单:

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

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

    • 定义邮件分隔符/分隔符
    • 使用while循环从流中读取数据
    • Concat所有字节,尝试找到分隔符
    • 如果分隔符存在,请拆分数据,提取消息

    这是很多工作,甚至超过我的程序的整个逻辑,所以我想知道是否有一个库可以为我做上面的东西,有了这样的库我可以这样编程:

    // 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
    }
    

    欢迎任何建议,谢谢。

5 个答案:

答案 0 :(得分:3)

另一种选择可能是MSMQ,它是一个消息队列(而不是TCP / IP流),并处理消息而不是字节流。 MSMQ本身可以使用各种传输,包括TCP / IP或WCF等。

如果您只处理Windows(并且因为您提到.NET,这不是一个不合理的限制),它可以在Windows 2000的所有版本上使用。

有一些很好的示例代码可以向您展示使用它的基本方法,以及一些更高级的内容。发送者基本上构建了一条消息并对其进行排队,这很简单。听众收到完整的信息。

它可能不会简单得多,如果你想在Windows上发送消息,这是让它快速进行的最简单方法之一。

答案 1 :(得分:2)

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

构建消息的一种非常简单的方法是预先设置长度前缀。在发送方上,您将消息序列化为缓冲区,然后写入长度,然后写入缓冲区。接收器首先读取4个字节以获得长度。然后它读取身体。

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

所有这一切都很简单,你不太可能找到一个图书馆。这样的协议可以写成几十行。我的建议是自己动手。

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

答案 2 :(得分:0)

Apache Thrift是另一种选择,类似于WCF,但更简单,并且不绑定到某个.NET Framework。

http://thrift.apache.org/

它适用于.NET 2,甚至适用于Mono,

http://thrift.apache.org/docs/install/

答案 3 :(得分:0)

我认为 SignalR 开源框架应该有所帮助。

查看quickstarts samples,了解它是否符合您的要求。

答案 4 :(得分:-1)

现在您可能需要考虑使用WebSockets。

尽管名称它实际上是一个更通用的协议。它本质上是面向消息的。虽然消息可能被分成帧,但是有很多库会重新组合这些帧,以便您收到完整的消息。

由于这些库,您可以使用WebSockets而非平台独立。 Node,.Net,纯浏览器javascript - 没问题。