我想将数据从服务器连续(流式传输)发送到客户端,而不需要客户端不断循环并检查任何数据。我认为我相信这是观察者设计模式是对的?这怎么可能?
有人可以提供我可以用谷歌搜索的东西的清单吗?观察者模式方面是如何实现的?
谢谢
我想将数据从服务器连续(流式传输)发送到客户端,而不需要客户端不断循环并检查任何数据。我认为我相信这是观察者设计模式是对的?这怎么可能?
有人可以提供我可以用谷歌搜索的东西的清单吗?观察者模式方面是如何实现的?
谢谢
观察者设计模式与您所描述的略有不同:
请注意,每个观察者都会收到“可观察”对象的通知;因此,如果您有一个持续传输数据的服务器,那么您希望服务器“通知”您吗?您希望服务器通知您什么?它发送给你的每个数据包?每块数据包?
简而言之:不,您不能在客户端/服务器应用程序上实现观察者模式。服务器没有(简单的)方法可以在您的客户端应用程序上调用通知方法,如果您的客户端断开连接,那么它不会从可观察对象中注销。
所以回到你的问题......你受到架构的限制:阻塞套接字(tcp / udp)在你收到数据之前都是通过阻塞来工作的。一旦你收到数据,你必须循环并再次调用receive以不断获取更多数据。另一种方法是使用异步套接字:
异步套接字通信可能与观察者模式一样接近。此外,您希望使用 UDP 协议,因为您有流数据,而 UDP 是专门为流数据设计的。如果您不想错过任何数据包(由于 UDP 的不可靠性),那么您可以使用可靠的 UDP。
您无法为客户端/服务器用例实现观察者模式,因为通信协议完全不同。(RPC 可能合适,但您使用的是 TCP)
无论如何,您可以做的是拥有一个专用的 TCP 客户端来接收数据。正是这个 TCP 客户端和你的内部类可以一起实现观察者模式。有了这个,您的班级将不再需要等待(轮询)数据。
沙什
据我了解,这里主要关注的是客户端应用程序不应被阻止等待来自服务器的数据。为此,您可以创建一个将作用于套接字事件的线程。您可以使用此线程模块注册您的类的上下文,并且每当接收到数据时,此线程模块可以使用注册的上下文进行回调(通知)。