繁体   English   中英

我的UDP套接字服务器设计正确吗?

[英]Is my design for UDP socket server correct?

我正在设计一个使用MFC进行UDP通信的服务器。 我有以下课程

  • CMyDlialog-照顾用户界面
  • CController-充当所有类之间的中介者
  • CProtocolManager-注意编码/解码消息(这是一个静态类)
  • CConnectionManager-负责UDP连接,发送,接收

我正在将CConnectionManager的对象创建为CController中的成员变量,并将CController的对象创建为CMyDialog中的成员变量。

当用户键入内容并按send时,我正在CControler中调用一个方法,该方法将在CProtocolManager中调用一个方法来构造数据包,并调用CConnectionManager方法来发送它。

当我收到一些数据时,它将在CConnectionManager的线程中处理。 我在这里创建一个CController的本地对象并调用一个方法,该方法会将数据传递给CProtocolManager进行解码。

现在,我想通知UI有关数据,CControler应该如何做? 我可以通过使主对话框句柄变为全局来向UI发布消息,这是一种正确的方法。

还告诉我这种设计是否正确。

提前致谢

看来您是在单个线程中完成所有操作。 由于数据包来回往返需要时间,因此建议在其他线程中完成耗时的工作,并发布状态/结果UI线程。 (否则,UI将被冻结)。

我认为设计永远不会是非对非,但是您可以根据许多人认为是“好”的一些原则(请参见SOLID原则对它们进行评级

您的发送方法听起来很合理,但是将Dialog全局设置为接收状态绝对被认为“不太好”。 参见好莱坞原则 我建议您最好将回调方法传递给连接管理器,该方法是CController的方法(然后让CProtocolManager对其进行解码并从对话框中调用另一个回调方法)。 如果回调不是您想要的,则可以使用方法定义类似于“ AbstractMessageReceiver”的AbstractBaseClasses(ABC)

 virtual void receive(const char*, int length) = 0;

然后,您可以在CProtocolManager中实现此ABC,将其作为“ AbstractMessageReceiver *”传递给CConnectionManager,然后调用

m_myMessageReceiver->receive(m_buffer, m_length);

或类似的东西。

这种方法减少了耦合,更具可测试性,并增加了可重用性。

此外,我同意Am,您应该考虑自己的线程模型!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM