5

虽然我是套接字编程的新手,当我正在编写一个简单的 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
}

欢迎任何建议,谢谢。

4

5 回答 5

3

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

如果您只处理 Windows(并且由于您提到了 .NET,这并不是一个不合理的限制),它适用于从 Windows 2000 开始的所有版本。

有一些很好的示例代码向您展示了使用它的基本方法,以及一些更高级的东西。这很简单,发件人基本上构建了一条消息并将其排队。侦听器收到完整的消息。

它再简单不过了,如果你想在 Windows 上进行消息传递,这是让它快速运行的最简单方法之一。

于 2012-09-13T08:51:53.583 回答
2

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

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

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

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

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

于 2012-09-13T08:56:50.797 回答
0

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

http://thrift.apache.org/

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

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

于 2012-09-13T09:00:34.677 回答
0

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

查看快速入门示例,看看它是否符合您的要求。

于 2012-09-13T09:07:01.303 回答
-1

现在你可能想考虑使用 WebSockets。

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

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

于 2017-02-10T16:08:45.000 回答