首页 文章

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

提问于
浏览
4

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

我的程序很简单:

  • 客户端连接到服务器

  • 服务器以可预见的间隔不断向客户端发送消息

  • 客户端接收消息并根据消息中包含的数据进行工作

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

  • 定义 message delimiter / separator

  • 使用 while 循环从流中读取数据

  • Concat所有字节,尝试查找 delimiter

  • 如果存在 delimiter ,则拆分数据,提取消息

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

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

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

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

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

    所有这一切都很简单,你不太可能找到一个图书馆 . 这样的协议可以写成几十行 . 我的建议就是亲自去做 .

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

  • 2

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

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

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

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

  • 3

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

    http://thrift.apache.org/

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

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

  • 0

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

    看看quickstarts samples,看看它是否符合您的要求 .

  • -1

    现在您可能想要考虑使用WebSockets .

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

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

相关问题