虽然我是套接字编程的新手,但是当我编写一个简单的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 回答
在字节流中嵌入分隔符并不像它看起来那么容易 . 您必须处理意外包含分隔符的消息 . 这会导致许多令人讨厌的检测和转义代码 .
构建消息的一种非常简单的方法是预先设置长度前缀 . 在发送方上,您将消息序列化为缓冲区,然后写入长度,然后写入缓冲区 . 接收器首先读取4个字节以获得长度 . 然后它读取身体 .
这不是内置于.NET中,可能是因为每个二进制协议都略有不同 .
所有这一切都很简单,你不太可能找到一个图书馆 . 这样的协议可以写成几十行 . 我的建议就是亲自去做 .
但是,如果您想构建消息,那么有一个很棒的库:protobuf-net(适用于.NET的Google协议缓冲区) . 它为您提供消息框架,并以非常理智的方式进行序列化 . 它很好地支持协议版本控制 .
另一种选择可能是MSMQ,它是一个消息队列(而不是TCP / IP流),并处理消息而不是字节流 . MSMQ本身可以使用各种传输,包括TCP / IP或WCF等 .
如果您只处理Windows(并且因为您提到.NET,这不是一个不合理的限制),它可以在Windows 2000的所有版本上使用 .
这里有一些很好的示例代码,向您展示了使用它的基本方法,以及一些更高级的东西 . 发送者基本上构建了一条消息并对其进行排队,这很简单 . 听众收到完整的消息 .
它可以简单得多,如果你想在Windows上发送消息,这是让它快速进行的最简单的方法之一 .
Apache Thrift是另一种选择,类似于WCF,但更简单并且不绑定到某个.NET Framework .
http://thrift.apache.org/
它适用于.NET 2,甚至对于Mono,
http://thrift.apache.org/docs/install/
我认为 SignalR 开源框架应该有所帮助 .
看看quickstarts samples,看看它是否符合您的要求 .
现在您可能想要考虑使用WebSockets .
尽管名称它实际上是一个更通用的协议 . 它本质上是面向消息的 . 虽然消息可能被分成帧,但是有很多库会重新组合这些帧,这样您就可以收到完整的消息 .
由于这些库,您可以使用WebSockets而非平台独立 . Node,.Net,纯浏览器javascript - 没问题 .