2011-07-30 33 views
2

我想將數據從服務器發送到客戶端,持續(流式),而不需要客戶端連續循環並檢查任何數據。我認爲我相信這是觀察者設計模式是正確的?這怎麼可能?如何在C++中實現觀察者設計模式流數據?

有人能給我提供我可以谷歌的東西的清單嗎?觀察者模式方面如何實施?

感謝

+0

你看過[Boost.Signals2](http://www.boost.org/doc/libs/1_47_0/doc/html/signals2.html)嗎? – Praetorian

回答

3

觀察者設計模式是略有不同,因爲你描述:

enter image description here

注意,每個觀察者得到由「可觀察的」對象通知;所以如果你有一臺連續流式傳輸數據的服務器,那麼你會期望服務器「通知」你,你希望服務器通知你什麼?它發送給你的每個數據包?每一個包的大塊?

簡而言之:不,您無法在客戶端/服務器應用程序上實現觀察者模式。服務器沒有(簡單的)方法來調用客戶端應用程序的通知方法,並且如果客戶端斷開連接,則不會從observable中取消註冊。

所以回到你的問題......你受到體系結構的限制:阻塞套接字(tcp/udp)通過阻塞直到你接收到數據都可以工作。一旦您收到數據,您必須循環並再次呼叫接收,以便不斷獲取更多數據。另一種方法是使用異步套接字:

異步套接字通信可能會接近觀察者模式。此外,你想使用UDP協議,因爲你有流數據,UDP是專門爲流數據設計的。如果你不想錯過任何數據包(由於UDP的不可靠性),那麼你可以使用reliable UDP

+0

+1異步套接字 – RocketR

+0

嗨。好吧,也許我不應該提到觀察者模式。我希望客戶端在服務器發送數據後立即接收數據,而不必每隔幾秒輪詢一次服務器。 – Paul

+0

@Paul,異步套接字將正常工作,並且阻塞套接字不應要求您在一段時間內輪詢(即套接字阻塞,直到有數據讀取)。我想說,你在一段時間內投票的時間有99%表明「你做錯了!」 :) – Kiril

0

由於通信協議完全不同,您無法實現客戶端/服務器用例的觀察者模式。 (RPC可能是合適的,但你使用的是TCP)

無論如何,你可以做的是有一個專用的TCP客戶端接收數據。正是這個TCP客戶端和你的內部類可以一起實現Observer模式。有了這個,你的班級將不再需要等待(輪詢)數據。

詞shash

0

據我瞭解,這裏主要關注的是客戶端應用程序不應該被阻止等待來自服務器的數據。爲此,您可以創建一個將對套接字事件起作用的線程。您可以使用此線程模塊註冊您的類的上下文,並且只要收到數據,此線程模塊就可以使用註冊的上下文進行回調(通知)。