设计面向对象的同步接收器和发送器

Posted

技术标签:

【中文标题】设计面向对象的同步接收器和发送器【英文标题】:Designing object oriented synchronous receiver and transmitter 【发布时间】:2013-09-10 18:48:55 【问题描述】:

我正在开发一个同步发送器和接收器的数据通信类项目。发送者将是使用套接字的服务器,当接收者客户端连接时,它将分叉并向接收者发送一条消息,该消息存储在一个文本文件中,作为服务器启动时的参数给出。

我的问题不是实现,我知道如何实现所有这些功能。我的问题是如何在 C++ 中将其组织成类等。

消息将是 2 个 SYN 字符,一个指示消息长度的控制字符,以及最多 64 个字节的消息数据。

我的第一个想法是我想要一个服务器类和一个客户端类。我将有 2 个主要功能,一个将有一个服务器(发送器)对象,另一个将有一个客户端(接收器)对象。从这些***别的课程升起,我不知道如何组织较低级别的东西。

我需要一个不同的“物理”、“数据链路”和“应用程序”层。物理层将处理消息转换为二进制,计算奇偶校验等。数据链路层将帧消息,应用程序将是***别。如何组织这些?命名空间?

就像我说的,实施不是我的问题。只是设计,我经常感到沮丧,因为我觉得我们在事物的设计和组织方面没有得到足够的教导。 C++ 是我的专业领域,C 也很好,我只是零经验做没有类的高级应用程序之类的。

请随意推荐阅读经典的设计模式书籍,因为我有一本。谢谢大家的帮助。

【问题讨论】:

为什么这个标签是“C”? 我建议使用Message 可以处理自己的序列化/反序列化的类。为什么需要三个不同的层? 我同意这三个不同的层在这里似乎有点过分了。我需要它们,因为项目描述说我需要。这就是为什么我认为像命名空间这样简单的东西可以满足这个要求。 【参考方案1】:

我的建议是你有一个客户端和服务器都使用的“消息”类。该类将封装网络洋葱层。由于您既要发送消息又要接收消息,因此您要么有两个构造函数——一个用于根据参数组装要发送的消息,另一个用于将原始输入流解析为接收到的消息——或者一个纯虚拟基础对于两个派生类。

不要试图在消息类中引用服务器或客户端类;以一种方式进行耦合,以便服务器/客户端类使用消息对象。

还为服务器/客户端类使用纯虚拟基础,表示套接字的接口。 假定 TCP: 这也是服务器维护连接的基础,因为每个连接都是一个单独的套接字。服务器中心的套接字是listen() 套接字,不需要进行任何读取或写入,它只是accept()s,但是当它这样做时,它会创建一个新的连接对象,其套接字将被读取和写入,所以这些是可以被基类包装的例程。总结一下:

abstract class "TCPsocket" 
    -> derived class "Server"
    -> derived class "Client"
    -> derived class "Connection"

一个服务器对象将包含不同数量的活动连接对象; Client 对象只是一个 Client 对象。

【讨论】:

纯虚基是指具有所有纯虚函数的抽象类吗? 不一定全部。又名“纯虚拟”。 C++ 中的“抽象”类至少有一个纯虚方法,因此不能实例化;它只是作为一个基类。我想这里的那些不必是字面上的……我的意思是这样一个基本的“消息”类不会用于实例化。请注意,即使无法实例化该类(因为它确实是抽象的),您也可以使用该类型传递一个对象并使用它——但您需要使用非抽象派生类来创建它。这是OOP中多态性的一个重要潜力。 这个想法是在“messageIn”和“messageOut”对象中可用的所有代码都将在基本“message”类中,同样适用于“客户端”和“服务器”关于“套接字”。如前所述,使用具有两个不同构造函数的单个消息类可能更有意义。 但也许是服务器和客户端都继承自的“Stream”类?流类可以包含您提到的套接字。 当然。之前做过类似的事情,在那个基类中可能没有大量的东西专门用于处理套接字,但是从一开始就很好,因为这样一个对象将是独立服务器的核心,并且客户端进程。然后,您可以使用相同的基础来实现两个进程的日志记录等事情。我已经充实了与第三类的关系,表示与服务器建立的客户端的连接,上面(如果你分叉,这些也是单独的进程)。

以上是关于设计面向对象的同步接收器和发送器的主要内容,如果未能解决你的问题,请参考以下文章

面向对象

面向对象

java基础面向对象编程

杨玲 201771010133《面向对象程序设计(java)》第十三周学习总结

201871010111-刘佳华《面向对象程序设计(java)》第十三周学习总结

达拉草201771010105《面向对象程序设计(java)》第十三周学习总结