如何在C ++中实现观察者设计模式流数据?

时间:2011-07-30 13:46:26

标签: c++ tcp streaming udp server-push

我想将数据从服务器连续发送到客户端(流式传输),而无需客户端不断循环检查任何数据。我认为我认为这是观察者的设计模式是对的吗?这怎么可能?

有人可以向我提供一些我可以google的内容吗?如何实现观察者模式方面?

由于

3 个答案:

答案 0 :(得分:3)

观察者设计模式与您所描述的略有不同:

enter image description here

请注意,每个观察者都会被“observable”对象通知;所以如果你有一台连续流式传输数据的服务器,那么你是否希望服务器“通知”你,你希望服务器通知你什么?它发送给你的每个数据包?每一包数据包?

简而言之:不,您无法在客户端/服务器应用程序上实现观察者模式。服务器没有(简单)方法在客户端应用程序上调用notify方法,如果客户端断开连接,则它不会从observable中取消注册。

回到你的问题......你受到了体系结构的限制:阻塞套接字(tcp / udp)都通过阻塞工作,直到你收到数据。收到数据后,您必须循环并再次呼叫接收,以便不断获取更多数据。另一种方法是使用异步套接字:

异步套接字通信可能会接近观察者模式。此外,您希望使用UDP协议,因为您有流数据,而UDP专门用于流数据。如果您不想错过任何数据包(由于UDP不可靠),那么您可以使用reliable UDP

答案 1 :(得分:0)

由于通信协议完全不同,因此无法为客户端/服务器用例实现观察者模式。 (RPC可能是合适的,但你正在使用TCP)

无论如何,你可以做的是拥有一个专用的TCP客户端来接收数据。正是这个TCP客户端和你的内部类可以一起实现Observer模式。有了这个,您的班级将不再需要等待(轮询)数据。

词shash

答案 2 :(得分:0)

据我了解,这里主要关注的是不应该阻止客户端应用程序等待来自服务器的数据。为此,您可以创建一个将作用于套接字事件的线程。您可以使用此线程模块注册您的类的上下文,并且每当收到数据时,此线程模块可以使用注册的上下文进行回调(通知)。