从我的客户端/服务器接收序列化数据,一旦数据被反序列化,它就会进入一个命令处理程序,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
}
我遇到的困难是如何编写所有动作,例如:
- 我应该为客户端发送的内容和服务器应回复的内容分别设置一个枚举吗?
- 或者我应该有一个包含所有消息的枚举并按照要求进行操作?
- 或者我应该如何定义消息并处理它?
这是我的服务器/客户端当前所做的,只是为了让您更好地查看:
- 服务器启动
- 客户端连接
- 客户端向服务器发送身份验证
- 服务器验证客户端并发送连接的批准消息
- 客户端将从那里开始向服务器发送和更新配置文件
这只是一个大致的例子。
包处理程序
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:如果我的标题已关闭并且您有更好的建议,请告诉我,或者您是否可以继续更新它,我不确定如何用英语描述。