2012-10-07 71 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

相关问题