SmartFoxServer学习(3)--第一个Extension

前两篇都是基础工作, 只说不练是学不会的, 不废话, 来写第一个Hello world".

一. 环境

服务端: java 1.7

客户端: unity 5.2

二. 服务端

1. 依赖包

新建项目就不说了, java project就可以, 加入SmartFoxServer的依赖包sfs2x.jarsfs2x-core.jar, 两个jar包可以在SmartFoxServer的安装目录下的SFS2X/lib/下找到.

2. 代码编写

a. 新建类继承SFSExtension, 并重写init方法

 1 public class StudyExtenstion extends SFSExtension {
 2 
 3     @Override
 4     public void init() {
 5         
 6         // Client Requests
 7         addRequestHandler("test", TestHandler.class);
 8         
 9         // Server Events
10         addEventHandler(SFSEventType.SERVER_READY, OnServerReady.class);
11 
12     }
13 }
View Code
b. 客户请求处理类, 继承BaseClientRequestHandler, 并重写handleClientRequest方法
1 public class TestHandler extends BaseClientRequestHandler{
2 
3     @Override
4     public void handleClientRequest(User user, ISFSObject obj) {
5         tract("Hello world, client request.");
6     }
7 
8 }
View Code
c. 服务端事件触发处理类, 继承BaseServerEventHandler, 并重写handleServerEvent方法
1 public class OnServerReady extends BaseServerEventHandler{
2  
3      @Override
4      public void execute(ISFSEvent event) {
5          trace("Hello world, server event.");        
6      }
7  }
View Code

StudyExtension: 可以把理解成main方法(但很明显不是), 它是SmartFoxServer获取extendsion注册事件的入口, 相当于我们业务逻辑和SmartFoxServer之间的一个中转, 具体可以看 这里 .

TestHandler: 客户端请求的处理类, 当服务端收到某个请求后, 根据请求ID找到对应的处理类来处理相关逻辑.

OnServerReady: 服务端事件触发处理类, 当服务端某个事件被触发后, 通知该事件的监听类来处理类.

3. 打包

  导出jar包就不说了, 需要注意的是jar的名称, jar文件名称一定要以Extension结尾, 即 xxxExtension.jar, 这是SmartFoxServer的一个约定, 不按这个来在后台页面是看不到你的extension的.

4. 发布

  找到此目录SmarFoxServer安装目录/SmartFoxServer_2X/SFS2X/extensions/, 新建一个文件夹, 取个好名字, 这个好名字是有用的, 然后将打包好的jar包放到此目录下(这步操作可以通过后台管理页面来实现).

  登录后台, 打开Extension Manager, 刚建的文件夹名字如果出现在列表里且里面含有xxxExtension.jar说明发布成功.

  此时在eclipse里启动SmartFoxServer(怎么在eclipse里启动SmartFoxServer看这里), 在控制台会看到 "Hello world, server event." 的输出信息.

  万事具备, 还差很多!

三. 后台配置

  先看下Zone 和Room 的结构关系, 更详细的看 这里 

  

1. 创建Zone

  登录后台, 打开Zone Configurator, 点击左下角的小绿色图标, 打开Zone 的配置界面, 配置信息很多, 主要关注GeneralZone Extension 两个

  General 主要是基本信息的配置, 包括登录方式, 人数, 房间, 词过滤, 连接等一些的配置, 除了Zone name 都有默认值

  Zone name: zone名称(GameZone), 必填, 最好取个好听点的名称, 因为这个也是有用的

  Force logout: 用户重名验证, 如果为true, 当有重名用户登录时, 先登录的用户会被踢下线

  Use custom login: 是否允许游客登录, false 游客登录, true 验证登录, 注: 如果为false 是不会触发USER_LOGIN 事件的

  Maximum length of Room names: 房间名称最长长度, 这个修改大一点, 不然会造成房间房间失败

  Zone Extension 附加到此Zone的逻辑处理程序, 即我们的代码, 其实就是刚才那个jar包

    Name: 文件夹名称, 就是发布那一步创建的文件夹名称

    Type: 这里就选JAVA

    Main class: 我们的扩展类的完整包路径名称, 这里SmartFoxServer会自动扫描该类, 当name选择完成后这里会自动填充.

  Zone配置完成, 点击下面的submit保存, 然后再cancel关闭

2. 创建Room

  选中刚新建的TestZone, 点击对应在Rooms下面的绿色图标, 出现Room的配置界面, 同样是General 和Room Extension

  Room Name: 房间名称(GameRoom), 必填. 

  其它就不说了, 需要注意的是Room Extension, 这里也可以附加对应逻辑处理程序, 而且也可以和Zone Extension是同一个处理程序, 造成的结果就是同样的事件会被触发两次.

四. 客户端

   客户端相对就比较简单了, 直接上代码.

  1 using Sfs2X;
  2 using Sfs2X.Core;
  3 using Sfs2X.Entities.Data;
  4 using Sfs2X.Requests;
  5 using Sfs2X.Util;
  6 using UnityEngine;
  7 
  8 public class Test : MonoBehaviour
  9 {
 10     public const string host = "192.168.11.100";
 11     public const int tcpPort = 9933;
 12     public const int udpPort = 9933;
 13     public const string defaultZone = "GameZone";
 14     public const string defaultRoom = "GameRoom";
 15 
 16     private SmartFox _sfs;
 17 
 18     void Start()
 19     {
 20         connect();
 21     }
 22 
 23     void Update()
 24     {
 25         // 处理SmartFoxServer事件
 26         if (null != _sfs)
 27             _sfs.ProcessEvents();
 28     }
 29     private void connect()
 30     {
 31         // 得到配置数据
 32         ConfigData cfg = initConfig();
 33 
 34         // 连接服务器
 35         _sfs = new SmartFox();
 36         _sfs.Connect(cfg);
 37 
 38         // 添加监听事件
 39         _sfs.AddEventListener(SFSEvent.CONNECTION, onConnection);
 40         _sfs.AddEventListener(SFSEvent.CONNECTION_LOST, onConnectionLost);
 41 
 42         _sfs.AddEventListener(SFSEvent.LOGIN, onLogin);
 43         _sfs.AddEventListener(SFSEvent.LOGIN_ERROR, onLoginError);
 44     }
 45     private ConfigData initConfig()
 46     {
 47         ConfigData conf = new ConfigData();
 48         conf.Host = host;
 49         conf.Port = tcpPort;
 50         conf.UdpHost = host;
 51         conf.UdpPort = udpPort;
 52         conf.Zone = defaultZone;
 53         conf.Debug = true;
 54         return conf;
 55     }
 56     
 57     private void onConnection(BaseEvent evt)
 58     {
 59         bool success = (bool)evt.Params["success"];
 60         if (success)
 61         {
 62             // 连接成功后发送登录请求
 63             Debug.Log("connect server successed.");
 64             IRequest req = new LoginRequest("username");
 65             send(req);
 66         }
 67         else
 68         {
 69             string errorMsg = (string)evt.Params["errorMessage"];
 70             Debug.Log("connect server failed, errorMessage: " + errorMsg);
 71         }
 72 
 73     }
 74     private void onConnectionLost(BaseEvent evt)
 75     {
 76         string reason = (string)evt.Params["reason"];
 77         Debug.Log("connection lost, reason: " + reason);
 78     }
 79     private void onLogin(BaseEvent evt)
 80     {
 81         // 登录成功后发送测试请求
 82         string extCmd = "test";
 83         ISFSObject parameters = SFSObject.NewInstance();
 84         IRequest req = new ExtensionRequest(extCmd, parameters);
 85         send(req);
 86     }
 87     private void onLoginError(BaseEvent evt)
 88     {
 89         string errorMsg = ComUtil.getErrorMessage(evt);
 90         Debug.Log("login error, error message: " + errorMsg);
 91     }
 92     public void send(IRequest req)
 93     {
 94         if (null == _sfs)
 95             return;
 96 
 97         // 向服务端发送请求
 98         Debug.Log("[send message, message: ] " + req.ToString());
 99         _sfs.Send(req);
100     }
101 
102 }
View Code

运行客户端, 服务端收到请求, 输出 "Hello world, client request." 信息.

代码很简单, 连接成功后发送登录请求,登录成功发送测试请求, 就不多说了.

第一个简单的extension已经完成了, 这里主要说的流程上的东西, 对整个开发过程做了个整体介绍, 知道写一个SmartFoxServer扩展要做哪些工作, 所以没涉及到任何业务逻辑, 后续再写一些具体与逻辑有关东西!

本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/code-boy/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/code-boy/p/4889791.html