C# TCP服务器/客户端的自定义消息帧协议

C# TCP服务器/客户端的自定义消息帧协议,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我使用Net.Sockets.Socket类来编写TCP服务器。由于TCP在流上运行,因此需要一种将消息彼此分离的方法。(有关详细信息,请参阅斯蒂芬·克利里(Stephen Cleary)在其博客中的消息框架帖子。) 我想要实现的是编写一个支持自定义消息帧协议的TCP服务器类。此类的初始化示例如下: var receiveDelimiter = Encoding.UTF8.GetBytes("[END]"); var sendDelimiter = Encoding.UTF8.GetBytes(

我使用Net.Sockets.Socket类来编写TCP服务器。由于TCP在流上运行,因此需要一种将消息彼此分离的方法。(有关详细信息,请参阅斯蒂芬·克利里(Stephen Cleary)在其博客中的消息框架帖子。)

我想要实现的是编写一个支持自定义消息帧协议的TCP服务器类。此类的初始化示例如下:

var receiveDelimiter = Encoding.UTF8.GetBytes("[END]");
var sendDelimiter = Encoding.UTF8.GetBytes("\r\n");
var protocol = new DelimiterFramingProtocol(receiveDelimiter, sendDelimiter);
var server = new Server(protocol);
server.Start(port);
该协议应该派生自抽象类MessageFramingProtocol,服务器应该能够使用它来分离消息。在上面的示例中,只有在收到分隔符(即“[END]”)时,服务器才应触发其DataReceived事件,并且DataReceived的参数只应具有位于分隔符之前的消息部分。如果在分隔符之后接收到更多字节,则服务器应存储这些字节,并仅在再次接收分隔符时激发DataReceived。服务器还应该在发送的每条消息之后发送sendDelimiter


我需要的不是整个服务器类或任何协议类。我需要的是一个模板,一个设计建议。假设我在server类中有一个名为Protocol的FramingProtocol类型的属性,如何在server类中的接收和发送操作中使用它?它应该有哪些抽象方法/属性来提供您在上面看到的灵活性?我应该能够编写从FramingProtocol派生的自定义协议类。它们可以使用分隔符、长度前缀(两者都可以)或其他自定义方法来分隔消息。

我不会只使用一个传递到服务器的协议实例,它需要大量的分隔符。为服务器提供一个factory类,该类可以创建新的协议实例,也可以从启动时创建并填充的池中对它们进行depool

我通常是这样做的:

接收: 提供“int-Protocol::addBytes(char*data,int-len)”函数。通过输入原始rx数据的地址和长度,函数返回-1(表示它已使用所有原始数据,而未完全组装协议单元),或正整数,即在组装有效PDU时使用的数据索引。如果实例成功组装了PDU,则可以对其进行进一步处理(例如,激发到“DataReceived(Protocol*thisPDU)”事件中,并创建一个新的协议实例(或depooled),然后加载剩余的原始数据

德克萨斯州: 提供(很可能是重载的)“bool Protocol::loadFrom(SomeDataClass*outData,OutStreamClass*outStream)”方法,该方法可以将任何源的数据加载到内部成员变量中,以便存在一组完整的数据来生成序列化的PDU,(并返回false,或者在出现问题时引发异常-例如,提供的数据未通过健全性检查)。如果未检测到错误,则实例将序列化数据从传递的'outStream'流/socket/buffer+len中移出