NetWay简要开发文档0.1

NetWay

项目主页:http://code.google.com/p/netway

使用效果:http://blog.csdn.net/shallwake/archive/2009/12/04/4942099.aspx

一,结构概览:

首先看一下主要功能模块之间的关系,方框表示主要的类,椭圆表示该类完成的功能。

服务端

客户端

可以看出,服务端的逻辑模块为Controller。客户端的逻辑模块为Client。我们所需要做的就是继承这两个类,实现接口供引擎调用,然后扩展自己的逻辑功能。


二,通信协议

当然,还有一个接口必须扩展,那就是客户端与服务端的通信协议,NetWay系统自带了EventDefault类默认实现该接口,而且满足大多数需求。

我们看看通信协议的实现:

Message Header长度是固定的,PayLoad可根据需要进行扩展。下面一一讲解各消息字段的含义。

  • ClientID:保留位,默认为0,可根据需求扩展,如放入软件版本号。
  • AppNameHash:程序名的HASH值,供服务端读取后调用对应逻辑模块。
  • payLoadSize:数据包体长度。

我们不需要关心复杂的消息处理机制,引擎已经帮我们做好了,所以只需创建消息,设定相关字段,传递给引擎即可。读取消息类似。

再看看引擎的默认消息实现类,EventDefault。它实现了Event接口以便引擎调用,并且定义了常规的通信协议,用户可根据需要改造他。其中最主要的有3个,

eventType,playerId还有Message

。对于一般情况,我们只需 new EventDefault()并设置好这3个字段,然后交给引擎即可。eventType表示该数据包的类型,playerId表示发送者 ID,Message表示该数据包的消息。下面是eventType的实现:


  1.     public static final int C_LOGIN = 1001;
  2.     public static final int S_LOGIN_ACK_OK = 1002;
  3.     public static final int S_LOGIN_ACK_FAIL = 1003;
  4.     public static final int SB_LOGIN = 1004;
  5.     public static final int C_LOGOUT = 1005;
  6.     public static final int SB_LOGOUT = 1006;
  7.     public static final int S_DISCONNECT = 1007;
  8.     public static final int C_GET_PLAYERS = 1107;
  9.     public static final int S_GET_PLAYERS = 1108;
  10.     public static final int C_CHAT_MSG = 1201;
  11.     public static final int SB_CHAT_MSG = 1202;

C_*表示由客户端发送,S_*表示由服务器发送,SB_*表示服务器广播。关于消息填充与读取的实现,可参考源码。

有了消息的实现后,客户端与服务器就可以通信了,其中涉及一些java与C++的差异性,感兴趣的还是参考源码吧。。


三,定制服务端逻辑

下面讲解下如何用NetWay定制自己的系统。以服务端为例:

首先,创建ChatRoom类并继承NetWay.jar里的Controller类,然后,我们需要实现以下5个纯虚函数:

  • initController();
  • String getAppName();
  • Player createPlayer() ;
  • Event createEvent() ;
  • processEvent(Event e);

initController 主要用于一些额外的初始化;getAppName指示此模块的名称,方便引擎调用;createPlayer创建player数据,暂时返回 playerDefault,用户可扩展他;createEvent也暂时返回eventDefault,用户可扩展。processEvent为核心逻辑,自动获取消息。其中最主要的只有用红色标记的那2个,其余3个都是默认实现。

配合继承而来的2个函数

sendEvent(Event e, Player p)

sendBroadcastEvent(Event e, Collection players)

就可实现各种逻辑了。其实,processEvent就是引擎传递消息进来的接口,而 sendEvent 与 sendBroadcastEvent 则是传递消息给引擎的接口。以下是该5个函数的实现:


  1.     public String getAppName() {
  2.         return "ChatRoom";
  3.     }
  4.     public void initController(Config gc) {
  5.         players = new Hashtable();
  6.     }
  7.     public void processEvent(Event e) {
  8.         switch (e.getType()) {
  9.         case EventDefault.C_LOGIN:
  10.             login(e);
  11.             break;
  12.         case EventDefault.C_LOGOUT:
  13.             logout(e);
  14.             break;
  15.         case EventDefault.C_CHAT_MSG:
  16.             chat(e);
  17.             break;
  18.         case EventDefault.C_GET_PLAYERS:
  19.             getPlayers(e);
  20.             break;
  21.         }
  22.     }
  23.     public  Player createPlayer() {
  24.         return new PlayerDefault();
  25.     }
  26.    public  Event createEvent() {
  27.         return new EventDefault();
  28.     }

关于ProcessEvent接受消息后,如何处理它的函数就不列出来了,无非就是createEvent()后再 setEventType()+setMessage()。然后用继承而来的sendEvent或者sendBroadcastEvent交给引擎发送。

另外还需注意的是,ChatRoom类必须在顶部指定包名:package netway.controller; 并且需要导入NetWay.jar库与log4j库。

然后打包成ChatRoom.jar,放入Plugins目录即可投入使用。


四,定制客户端逻辑

客户端的定制比较简单,与服务端类似,继承Client类并扩展即可。


五,其他问题

由于我第一次接触静态库的编写,貌似Debug版与Release版不同,使用库的话必须使用对应版本,所以两种版本我都提供了。还有用MFC使用库的话,必须是选择“在共享Dll中使用MFCl",否则连接错误。。目前原因不明,猜测是静态库没使用包名,导致符号错误,下来我会改进。。另外,关于静态库的 使用方法可百度解决。

还有测试版代码可能有误,还在不断改进。以后会继续更新

最后还是建议看下服务端Controller类与客户端Client类源码,然后再看看ChatRoom例子。该系统本来就实现的很简单,最好把整个源码都看一遍。。虽然注释不够,有一点也是中英文混杂。。。但是代码还算规范。。封装也很浅,所以还是有学习价值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章