SmartFoxServer 2X Extension 调试方法 - 使用IntelliJ

简介

SmartFoxServer 2X 使用一个Extension来实现服务器端所有的逻辑,Extension使用jar包的形式,需要放到SFS 2X安装目录中的extension文件夹里面,Server在启动时会加载所有扩展。开发者自然关心到怎么进行调试,如果只能使用log输出的形式,未免也太影响开发效率。当然有简单的办法,借助ID E的远程调试(Remote Debug),可以轻松实现调试代码。关于SmartFoxServer 2X与Unity结合的例子可以参考文档,总结的笔记在这里。下面记录的是调试过程中的具体步骤和注意事项。使用到的相关软件环境如下:

  • SmartFoxServer 2.12.0
  • IntelliJ Community 2017.1
  • Unity 5.4.0
  • Visual Studio Community 2015

编写服务器端扩展

这里仅做一个简单的例子说明问题。服务器端一共有三个源文件,其中:

  • MyTestExtension.java 是Extention的主文件,扩展自SFSExtension类。该类重写了Extension的初始化和销毁的方法。在初始化的时候对服务器事件和客户端请求绑定处理类。

      import com.smartfoxserver.v2.core.SFSEventType;
      import com.smartfoxserver.v2.extensions.SFSExtension;
    
      public class MyTestExtension extends SFSExtension {
          @Override
          public void init() {
              trace("test in init");
              addRequestHandler("sum", SumHandler.class);
              addEventHandler(SFSEventType.USER_JOIN_ROOM, JoinRoomEventHandler.class);
          }   
          @Override
          public void destroy(){
              trace("text from destroy");
          }
      }
    
  • JoinRoomEventHandler.java 负责处理JoinRoom事件,扩展自BaseServerEventHandler类。在客户端发出加入房间的请求之后触发。类似的,可以自定义服务器事件的处理类。

      import com.smartfoxserver.v2.core.ISFSEvent;
      import com.smartfoxserver.v2.core.SFSEventParam;
      import com.smartfoxserver.v2.entities.Room;
      import com.smartfoxserver.v2.entities.User;
      import com.smartfoxserver.v2.entities.data.ISFSObject;
      import com.smartfoxserver.v2.entities.data.SFSObject;
      import com.smartfoxserver.v2.exceptions.SFSException;
      import com.smartfoxserver.v2.extensions.BaseServerEventHandler;
      
      public class JoinRoomEventHandler extends BaseServerEventHandler {  
          @Override
          public void handleServerEvent(ISFSEvent isfsEvent) throws SFSException {
              MyTestExtension testExt = (MyTestExtension)getParentExtension();
              User user = (User)isfsEvent.getParameter(SFSEventParam.USER);
              Room room = (Room)isfsEvent.getParameter(SFSEventParam.ROOM);
              trace(user);
              trace(room);
          }
      }
    
  • SumHandler.java 负责处理客户端自定义请求,扩展自BaseClientRequestHandler类。服务器与客户端通过SFSObject来传递参数,SFSObject封装了各种类型的数据在里面。

      import com.smartfoxserver.v2.entities.User;
      import com.smartfoxserver.v2.entities.data.ISFSObject;
      import com.smartfoxserver.v2.entities.data.SFSObject;
      import com.smartfoxserver.v2.extensions.BaseClientRequestHandler;
      
      public class SumHandler extends BaseClientRequestHandler{
          @Override
          public void handleClientRequest(User user, ISFSObject sfsobj) {
              int numA = sfsobj.getInt("NumA");
              int numB = sfsobj.getInt("NumB");
              SFSObject objout = new SFSObject();
              objout.putInt("NumC", numA+numB);
              send("SumNumber",objout,user);
          }
      }
    

使用IntelliJ打成jar包

打开源代码工程的菜单File->Project Structure,在"Project Settings/Artifacts"中新建一个JAR->from modules with dependencies,这里需要设置输出目录以及添加sfs2x的依赖库,主要是sfs2x.jar和sfs2x-core.jar两个jar包,见下图:

SmartFoxServer 2X Extension 调试方法 - 使用IntelliJ_第1张图片
ProjectStructure

需要注意的是,jar包的命名必须以Extension结尾,不然sfs会找不到。

确保代码无误,工程编译通过后,选择菜单“Build->Build Artifacts”,生成jar包。生成成功以后,要把jar包拷贝到sfs的扩展文件夹下面,在程序安装路径C:\Program Files\SmartFoxServer_2X\SFS2X\extensions。注意新建一个文件夹及其命名规范。当然也可以让IntelliJ把jar包直接生成在这个文件夹里面。

需要重新启动服务器才能使改动生效。

使用Admin Tool配置扩展

SmartFoxServer 2X自带一个界面管理工具,安装成功以后,默认地址是http://localhost:8080/。登陆进去,需要在Zone Configurator里面配置Zone或者Room的Extension,才能使扩展生效。

需要注意的是,Zone或者Room的Extension作用范围不同,当然Zone的作用范围更大,这里只需要指定一个就够了。如果两个都指定了的话,对于用户加入房间这种事件则会触发两次。

SmartFoxServer 2X Extension 调试方法 - 使用IntelliJ_第2张图片
ZoneConfigurator

配置完成点击Submit生效,有的时候不行的话,也要重启服务。

使用Admin Tool配置调试选项

在Admin Tool中选择Server Congfigurator选项卡,JVM Setting选项卡,在JVM options里面添加下面三个选项:

-Xdebug
-Xnoagent
-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
SmartFoxServer 2X Extension 调试方法 - 使用IntelliJ_第3张图片
ServerConfigurator

配置完成点击Submit生效,有的时候不行的话,也要重启服务。

在IntelliJ中配置远程调试

打开Run/Debug Configurations对话框,新添加一个Remote Debug,名字可以随意起,主要是端口这里要改成8787,与上步中的JVM选项要保持一致。

SmartFoxServer 2X Extension 调试方法 - 使用IntelliJ_第4张图片
RemoteDebug

配置完成之后,启动远程调试,可以看到控制台中输出以下文字,说明远程连接成功。

Connected to the target VM, address: 'localhost:8787', transport: 'socket'

记得在工程中的代码文件上打上断点,不然可是停不下来。

客户端发送请求

至此,服务器端远程调试配置完成,万事俱备,只欠东风。下面就需要在客户端中发送请求了,这里使用Unity的C#客户端,给出一些关键代码如下。

  • 添加扩展响应事件监听,服务器响应之后的回调处理

    sfs.AddEventListener(SFSEvent.EXTENSION_RESPONSE,OnExtensionRespose);

  • 客户端发出加入房间的请求,服务器端会进入事件处理程序

    sfs.Send(new Sfs2X.Requests.JoinRoomRequest("The Lobby"));

  • 客户端发送扩展请求,服务器端进入SumHandler请求处理程序

      ISFSObject obj = new SFSObject();
      obj.PutInt("NumA", 1);
      obj.PutInt("NumB", 2);
      sfs.Send(new ExtensionRequest("sum",obj));
    
  • 服务器端处理完成后,客户端进入回调函数

      private void OnExtensionRespose(BaseEvent evt)
      {
          string cmd = (string)evt.Params["cmd"];
          ISFSObject objIn = (SFSObject)evt.Params["params"];
          if (cmd.Equals("SumNumber"))
          {
              int c = objIn.GetInt("NumC");
              Debug.Log(c);
          }
      }
    

好了,代码里加上断点,就可以自由活动了!

参考

  1. http://docs2x.smartfoxserver.com/ExamplesUnity/introduction
  2. http://docs2x.smartfoxserver.com/ExtensionsJava/overview
  3. http://www.cnblogs.com/funyuto/archive/2013/05/08/3068096.html

你可能感兴趣的:(SmartFoxServer 2X Extension 调试方法 - 使用IntelliJ)