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