一、通信架构:

基于Mina 2.0.4 

java手游_djws



  • MdcInjectionFilter:用于记录相关信息到日志中,以便开发者进行bug诊断。
  • ByteAttackFilter:限制 最大连接数,最大活动连接数,BLOCKED_IPS,BLOCKED_PLAYER_IDS(虽然进行了这个判断,但是没有获取到playerId,所以不起过滤作用),字节数防洪
  • CmdAttackFilter:BLOCKED_IPS,BLOCKED_PLAYER_IDS(不起过滤作用),数据包防洪
  • ProtocolCodecFilter(ProtocolCodecFactory):用于消息的解码和编码ProtocolCodecFactory包装了decoder和encoder的实现RequestDecoder和ResponseEncoder。
    其中:
    1.RequestDecoder负责处理消息断包、粘包 和反序列化。支持两种反序列化方式:AMF3反序列化成ASObject;java class反序列化成java object。
    2.ResponseEncoder负责消息序列化、封包,可序列化对象包括IoBuffer、byte[]和Response。支持两种序列化方式:AMF3和java class序列化。注:在djws-server中,response消息 可序列化对象只有Response。
  • ExecutorFilter(OrderedThreadPoolExecutor):配置了IoHandler处理请求消息的线程池。对于一个session,线程池将按io event/request message先后顺序进行处理。
  • IoHandler:request消息处理器。WarriorsServerHandler的职能:
    1.收到消息时,IP黑名单的过滤,匿名cmd的校验(有的命令必须是登陆过的用户才能发送)、管理员必须为mis客户端;
    2.转发request到ServerHanlder中(之后再由ServerHanlder调用Dispatcher转发器,根据消息类型(moduleId),把消息转发给相应的handler模块处理);
    3.session关闭时,触发ContainerFacade中的登出listener(并删除玩家数据);session打开时,判断是否是MIS ip和管理员配置的open ip。

    二、Request处理过程
    Module与Handler一一对应。在一个handler中,包含若干个cmd。 Cmd与Invoker一一对应。

     之后invoker从ASObject中读取请求数据,调用封装好的facades和managers进行业务处理。


三、消息格式:基于二进制字节流

java手游_djws_02


修正:最后一张图是response protocol,其中的最后一个字段也是respoonse value:object

四、业务架构:

Module:

public static final int ADMIN = 10000;
  public static final int CHAT = 1;
  public static final int CHANNEL = 2;
  public static final int USER = 3;
  public static final int MAP = 4;
  public static final int TASK = 5;
  public static final int PROPS = 6;
  public static final int SKILL = 7;
  public static final int FIGHT = 8;
  public static final int SHOP = 9;
  public static final int FRIENDS = 10;
  public static final int TEAM = 11;
  public static final int ALLIANCE = 13;
  public static final int MERIDIAN = 14;
  public static final int LOOT = 15;
  public static final int TRAIN = 16;
  public static final int FLYSHOES = 17;
  public static final int CAMP = 18;
  public static final int DUNGEON = 19;
  public static final int PET = 20;
  public static final int MORTAL = 21;
  public static final int HORSE = 22;
  public static final int TRADE = 23;
  public static final int MARKET = 24;
  public static final int TITLE = 25;
  public static final int DUNGEONTASK = 26;
  public static final int NOTICE = 27;
  public static final int RANK = 28;
  public static final int LOTTERY = 29;
  public static final int VIP = 30;
  public static final int GIFT = 31;
  public static final int TREASURE = 32;
  public static final int ACTIVE = 33;
  public static final int CAMP_BATTLE = 34;
  public static final int MAIL = 35;
  public static final int BATTLE_FIELD = 36;
  public static final int ACHIEVE = 37;
  public static final int RECHARGE_GIFT = 38;

 

五、程序组织结构/分层:

1.通用组件 (jar)

eventBus、dbservice、 resourceService 、SessionManager 、Scheduler、Pusher

2.game common:

--Service(ResourceAdapter )、voFactory、--Pusher、astar、commonConstant(common result code)

3.单一模块 内部结构

java手游_网页游戏服务器端_03


 

为了提高复用性,--Pusher 一般只在façade层调用。

金字塔的任何一层,可能会调用通用组件、common 模块和其他模块的facade、manager。

 

4.包结构组织还是很清晰的,值得借鉴:

java手游_java手游_04

.......

 

java手游_ARPG_05