3 Applications 前面的无论是libraries还是core,都是死的,只有applications加入了逻辑,它们是棋牌服务器的主休。下面是关于它们的比较详细的信息 3.1 CenterServer 图2 CenterServer与外界的交互图 CenterServer不直接与玩家进行交互,它主要的功能是管理游戏列表和房间信息,包括: 1. 游戏类型信息: 棋牌游戏、休闲游戏、视频游戏等。 2. 游戏种类: 比如在棋牌游戏这个大类之下有:德州扑克、斗地主、升级等。 3. 站点信息: 因为这个服务器架构完全支持分布式,所以还保存有站点的信息 4. 房间信息: 维护当前有哪些房间以及房间当前的在线人数。 CenterServer中有关游戏列表的信息是它在启动的时候从ServerInfoDB这个数据库加载的, 而它的房间信息来自RoomServer,RoomServer在启动时将自己注册进来,在关闭的时候从CenterServer中注销自己。同时在玩家进入房间的时候,还会要求CenterServer更新在线人数。 CenterServer还应该响应LogonServer和RoomServer的请求,将游戏列表和房间信息返回给它们。 3.2 LogonServer 图3 LogonServer与外界交互图 LogonServer提供注册新的游戏玩家服务并且处理游戏玩家的登录请求。 LogonServer需要和UserInfoDB交互,这些交互包括: 1. 在注册的时候写入注册玩家的信息。 2.在玩家登录的时候与数据库玩家信息进行核对。 LogonServer会定时地向CenterServer发送更新游戏列表和房间信息的请求,因为这些信息在不断地变化,而LogonServer需要在玩家登录时将这些信息返回给他们。 3.3 LogServer
图4 LogServer与外界的交互图 有时候,玩家可能会对游戏的过程产生怀疑,或者想回顾整个游戏的过程。这就需要服务器将游戏的过程以Log的形式存储起来,供玩家检查用。LogServer的就是用来响应玩家的核查的请求,然后从GameLogDB中将整个游戏过程返回给客户端,客户端以视频地方式显示给玩家。 玩家在请求检查的时候,客户端会将这局游戏的以及玩家的信息id发送到LogServer, LogServer根据游戏id的信息从GameLogDB取出日志信息返回给玩家。游戏的过程可以用结构化语言描述出来,本来postgresql直接支持Json,也就是说Log可以以JSON的形式存在数据库之中,但是由于可能会有字节序的问题,所以Log的信息也要用protobuf序列化了再存入数据库。LogServer在从数据库中读出日志后不用反序列化直接返回给客户端反序列化。 3.4 RoomServer RoomServer可能是最重要的一类Server了,一个RoomServer会和一个游戏模块结合在一起。它管理着游戏的一个房间,处理玩家进入房间,找桌子座下的请求,并将游戏相关的消息转发给游戏模块进行处理。不仅不同的游戏会有不同的RoomServer,即便是同一游戏,也可能有多个RoomServer, 比如对于德州扑克来说,就可能有vip房间,普通房间等等,同一类型的房间也可能有Room1,Room2,这个可以根据玩家量按需架设。图5给出了RoomServer与外界交互的图。 图5 RoomServer与外界的交互图 RoomServer启动的时候,先要发送请求给CenterServer进行注册,在关闭时要从CenterServer中注销。同时还会定时通知CenterServer更新在线人数, 定时从CenterServer上取回最新的游戏列表和房间信息。 RoomServer需要和玩家进行交互。玩家进入房间,找桌子座下等的请求都由RoomServer来处理,而游戏操作。比如说加注、发牌等 RoomServer会直接转发给游戏模块进行处理。 RoomServer管理着一个在线用户列表,在玩家进入房间,离开房间时这个列表随之更新。这个列表中有关玩家的详细信息是从数据库UserInfoDB中加载到的。 玩家在进行游戏时,由于输赢的关系,他的积分或者游戏币会随着变化,为了记录这些变化, 需要与GameDB进行交互。 管理员可以通过RoomServer来发布消息、踢出玩家、警告玩家、设置玩家权限、设置房间属性等活动。 玩家也可以通过RoomServer参与聊天(包括大厅公聊和私聊)。
|