1

从我的客户端/服务器接收序列化数据,一旦数据被反序列化,它就会进入一个命令处理程序,receivedData.Action其中ClientMessage

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. 服务器启动
  2. 客户端连接
  3. 客户端向服务器发送身份验证
  4. 服务器验证客户端并发送连接的批准消息
  5. 客户端将从那里开始向服务器发送和更新配置文件

这只是一个大致的例子。

包处理程序

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()},
    };
}

初始化示例

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:如果我的标题已关闭并且您有更好的建议,请告诉我,或者您是否可以继续更新它,我不确定如何用英语描述。

4

2 回答 2

1

如果您的问题是关于如何按照我的理解设计类和交互,那么我会 - 它完全取决于您的应用程序的具体情况 - 将这个大枚举类型分成单独的、更小的那些更能描述它们所做的事情,以及您的意图,例如,ProfileAction,等等。然后ActionResultPingStatus当您使用这些枚举时,请确保您获得编译器时检查您是否正确执行它,否则,您正在做的几乎就像只是传递字符串。

它还与 OO 设计中坚持单一职责原则有关:对象应该具有单一职责。你现在的枚举有不止一个责任。

对于这些问题,我发现了解 .NET 框架的作用很有帮助:例如查看Ping 类以及它如何使用 PingStatus 枚举和其他枚举。

于 2012-10-07T16:34:32.423 回答
0

不确定我是否会使用枚举。它们在一小段代码中很棒,作为传达的价值暴露出来,它们远不及伟大。

对我来说,每条消息我都会有一个不同的类,而不是一条具有上帝属性的消息。

于 2012-10-11T22:47:13.623 回答