2012-10-07 65 views
2

從我收到的序列化的數據,一旦數據被反序列化我的客戶機/服務器,它進入一個命令處理程序,其中receivedData.ActionClientMessage處理客戶端/服務器消息?

Command._handlers[receivedData.Action].Handle(receivedData.Profile); 

的命令處理程序將制定出客戶端消息並返回響應應該給予客戶。

我對客戶端的消息如下的枚舉:

public enum ClientMessage 
{ 
    INIT = 1, 
    NEW_PROFILE, 
    UPDATE_PROFILE_EMAIL, 
    UPDATE_PROFILE_PASSWORD, 
    UPDATE_PROFILE_PHONE, 
    UPDATE_PROFILE_DATE, 
    UPDATE_PROFILE_SECRET_ANSWER, 
    UPDATE_PROFILE_POSTAL_CODE, 
    UPDATE_SUCCESS, 
    PING, 
    PONG, 
    QUIT 
} 

什麼,我有困難的是如何有書面的所有動作,例如:

  • 我應該有一個將客戶端發送的內容與另一個服務器應該回復的內容分開枚舉?
  • 或者我應該有一個枚舉所有消息,並按要求按照它?
  • 或者我應該如何去定義消息並處理它?

這是我的服務器/客戶端目前只給你一個更好的視野:

  1. Server啓動
  2. 客戶端連接
  3. 客戶端發送身份驗證服務器
  4. 服務器驗證客戶端併發送連接的批准消息
  5. 客戶端將從那裏開始發送和更新配置文件到服務器

這僅僅是一個例子。

IPacketHandler

public interface IPacketHandler 
{ 
    MyCommunicationData Handle(ProfileData profile); 
} 

命令

public class Command 
{ 
    public static Dictionary<ClientMessage, IPacketHandler> _handlers = new Dictionary<ClientMessage, IPacketHandler>() 
    { 
     {ClientMessage.INIT, new Init()}, 
     {ClientMessage.NEW_PROFILE, new NewProfile()}, 
     {ClientMessage.UPDATE_PROFILE_EMAIL, new UpdateEmail()}, 
     {ClientMessage.UPDATE_PROFILE_PASSWORD, new UpdatePassword()}, 
     {ClientMessage.UPDATE_PROFILE_PHONE, new UpdatePhone()}, 
     {ClientMessage.UPDATE_PROFILE_DATE, new UpdateDate()}, 
     {ClientMessage.UPDATE_PROFILE_SECRET_ANSWER, new UpdateSecretAnswer()}, 
     {ClientMessage.UPDATE_PROFILE_POSTAL_CODE, new UpdatePostalCode()}, 
     {ClientMessage.UPDATE_SUCCESS, new Success()}, 
     {ClientMessage.PING, new Ping()}, 
     {ClientMessage.PONG, new Pong()}, 
     {ClientMessage.QUIT, new Quit()}, 
    }; 
} 

實例的INIT的

public class Init : IPacketHandler 
{ 
    public MyCommunicationData Handle(ProfileData profile) 
    { 
     // Some verification to auth the client here 
     // bla bla 
     // return response 
     return new MyCommunicationData() { Action = ClientMessage.CONNECTED }; 
    } 
} 

PS:如果我的標題是關閉的,你有更好的建議,讓我知道,或者如果你可以繼續並更新它,但我不確定如何用英語來描述這一點。

+0

我不會在客戶端 - 服務器上標記這個問題,它必須做更多的面向對象的設計比客戶端服務器。 – kabaros

回答

1

如果你的問題是關於如何根據我的理解設計類和交互,那麼我會 - 它完全依賴於你的應用程序的細節 - 將這個大的Enumerations類型分離成單獨的,更小的更具描述性的類型他們做什麼和你的意圖,例如,ProfileAction,ActionResult,PingStatus等。然後,當你使用這些枚舉時,你確保你得到了編譯器時間檢查,你正在做它,否則,你所做的幾乎就像傳遞字符串一樣。

它也與在OO設計中堅持單一責任原則有關:對象應該有單一責任。現在你的枚舉有多個責任。

有了這些問題,我發現看看.NET框架的作用是否有用:例如查看Ping class以及它如何使用PingStatus枚舉和其他枚舉。

+0

我的問題主要是關於如何計算枚舉來威脅客戶端/服務器請求和響應。例如客戶端連接到服務器,然後它發送一個認證請求到服務器,服務器將回復一個認證響應命令。我可以在一個枚舉中完成所有操作,以便可以使用用於發送數據的同一個類來接收數據,或者使用2個不同的枚舉,這將導致2個不同的類或來自MyCommunicationData的派生類,以響應客戶端。不知道我是否清楚自己難以對付。 – Guapo

+0

沒問題。然後我的答案是,我認爲你應該擁有儘可能多的枚舉,因爲它們邏輯上有意義,然後方法應該使用它需要的枚舉。有了額外的類,方法比將不相關的概念放入單個類更好。這是面向對象設計的SOLID原則中的S Single Reponsibility原則。 – kabaros

0

不知道我會使用枚舉。它們在代碼的基礎上很好,作爲交流價值暴露出來,它們遠不如偉大。

對我來說,我會爲每條消息有不同的類,而不是一個帶有神財產的消息。

+0

不知道我是否明白你的意思,但以某種方式,我確實有一個類每個消息類型 – Guapo

+0

除非我誤會你有每個消息的一個類具有messagetype屬性的實例。我在說消息messagetype屬性,並有PingMessage,PongMessage等 –

+0

所以你建議刪除comm狀態(我的枚舉),並根據需求做?我目前正在使用枚舉來追蹤上次發送的內容以及接下來要接收的內容等。 – Guapo

相關問題