运维开发网

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

运维开发网 https://www.qedev.com 2020-07-05 08:48 出处:网络 作者:运维开发网整理
虽然我是套接字编程的新手,但是当我编写一个简单的tcp服务器 – 客户端程序时,我发现基于流的api并不方便使用. 我的程序很简单: >客户端连接到服务器 >服务器在不可预见的时间间隔内不断向客户端发送消息 >客户端接收消息并根据消息中包含的数据进行工作 但是,使用基于流的api,我必须: >定义消息分隔符/分隔符 >使用while循环从流中读取数据 > Concat所有字节,尝试查找分隔符 >如
虽然我是套接字编程的新手,但是当我编写一个简单的tcp服务器 – 客户端程序时,我发现基于流的api并不方便使用.

我的程序很简单:

>客户端连接到服务器

>服务器在不可预见的时间间隔内不断向客户端发送消息

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

但是,使用基于流的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
}

任何建议都会受到欢迎,谢谢.

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

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

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

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

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

0

精彩评论

暂无评论...
验证码 换一张
取 消