虽然我是套接字编程的新手,但是当我编写一个简单的tcp服务器 - 客户端程序时,我发现基于流的api使用起来并不方便。
我的程序很简单:
但是,使用基于流的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
}
欢迎任何建议,谢谢。
答案 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。
它适用于.NET 2,甚至适用于Mono,
答案 3 :(得分:0)
我认为 SignalR 开源框架应该有所帮助。
查看quickstarts samples,了解它是否符合您的要求。
答案 4 :(得分:-1)
现在您可能需要考虑使用WebSockets。
尽管名称它实际上是一个更通用的协议。它本质上是面向消息的。虽然消息可能被分成帧,但是有很多库会重新组合这些帧,以便您收到完整的消息。
由于这些库,您可以使用WebSockets而非平台独立。 Node,.Net,纯浏览器javascript - 没问题。