2010-10-07 106 views
0

我正在設計一個使用MFC的UDP通信中使用的服務器。我有以下類我的UDP套接字服務器設計是否正確?

  • CMyDlialog - 照顧用戶界面的
  • CController - 作爲一個調解員的所有類之間
  • CProtocolManager - 照顧編碼/解碼封郵件(這是一個靜態類)
  • CConnectionManager - 照顧UDP連接,發送,接收

我創造CConnectionManager的對象作爲CController作爲成員變量和對象CController的CMyDialog中的成員變量。

當用戶類型的東西,壓送,我打電話CControler的方法,這將調用一個方法CProtocolManager構建數據包,並調用CConnectionManager方法來發送。

在i接收一些數據,它在CConnectionManager的一個線程來處理。在那裏我創建了一個CController的本地對象並調用一個方法,它將數據傳遞給CProtocolManager進行解碼。

現在我想通知UI有關的數據,該CControler應該怎麼辦呢?我可以通過使主對話框處理全局來向UI發佈消息,這是一種正確的方法。

也告訴我,這種設計是否正確。

在此先感謝

回答

0

我認爲設計從來沒有對或錯,但是您可以根據許多人認爲「好」的原則對它們進行評分(請參閱the SOLID principles)。

您發送方法聽起來合理,但使對話全球對接收絕對算得上「不那麼好」。見the hollywood principle。我建議你最好把一個回調方法傳遞給你的連接管理器,這是一個CController的方法(然後讓CProtocolManager對它進行解碼並從對話框中調用另一個回調方法)。如果回調是不是你想要的,你可以定義AbstractBaseClasses(ABC)這樣的「AbstractMessageReceiver」有法

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

然後就可以實現這是什麼ABC在CProtocolManager通過這爲「AbstractMessageReceiver *」來CConnectionManager然後調用

m_myMessageReceiver->receive(m_buffer, m_length); 

或類似的東西。

這種方法減少的耦合,是更可測試,並增加了可重用性。

此外,我同意,你應該想想你的線程模型在這裏!

+0

所以我應該將AbstractMessageReceiver *傳遞給接收數據的線程函數,並將其傳遞給控制器​​,它將調用實際的接收方法? – Jeeva 2010-10-07 05:58:35

+0

你可以做到這一點,但我不知道你是否真的需要創建一個本地控制器,或者如果你可以將現有的控制器傳遞給連接管理器?然後,您可以將AbstractMessageReceiver傳遞給控制器​​,並且連接管理器無需擔心。 – Philipp 2010-10-07 06:26:04

0

看來你是在一個單一的線程中完成這一切。由於數據包需要花時間來回傳輸,因此建議在不同的線程中花時間工作,並在UI線程中發佈狀態/結果。 (或者UI將被凍結)。

+0

其實我正在偵聽連接並處理由CConnectionManager產生的不同線程中的請求。 – Jeeva 2010-10-07 05:22:07