SmartFoxServer2x Extension Debug调试心得

  这些天来一直用SmartFoxServer2x+unity在做公司新手游项目的服务器端开发。可以说对于SmartFoxServer甚至于手游服务器端开发都算是刚上手吧。一段时间研究下来,发现SmartFoxServer相关文档也比较丰富,所以它本身的易用性还是毋庸置疑的。读了官方的示例和文档后,自己也会写服务器端Extension了。官方文档有提到可以直接Debug Extension,但是对于Extension的Debug这点研究了很久,GOOGLE了很多对于这块也没有一个很明确的解决方案让我很是捉急啊,毕竟通过Eclipse打断点Debug SmartFoxServer2x Extension才是最有效率的方法嘛。一是能直接钻到代码里面打断点调试,这个爽快感就不用多说了。二是在项目开发过程中不用总是把Extension打成JAR包后配置服务器,如果这样开发岂不是要疯!

  GOOGLE Smartfox2x extension 调试方法的时候,别的博文有提到把smartfox所有文件拉到extension项目中,导入所有lib的jar包,建立main的这种debug方法。因为一直根据官方提供的debug方法还毫无头绪,所以试了一下这种方法。这个方法等于是把整个Smartfox都放到项目中去调试了,启动扩展项目调试等于是把整个smartfoxserver都加入进来debug了,的确是行之有效的,但是会把整个项目弄得复杂得多得多,所以被我果断放弃了。以下是自己总结出来的调试步骤:

1.把smartfoxserver2x设为Debug模式:

进入smartfoxserver2x的admin页面,进入到server configurator页,jvm settings->jvm options 点击ADD 加入开启debug调试的参数(来自于官方文档):

-Xdebug
-Xnoagent
-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

由于smartfox是基于jvm的,所以这里是运用的jvm的特性,jvm支持远程遥控debug,这些参数让Smartfox以支持RemoteDeubg的方式启动。

add以后点击submit提交设置,重启smartfoxserver,如果使用根目录下sfs2x文件夹的sfs2x.bat启动smartfox的话,便会看到如下信息:

说明smartfox以支持RemoteDeubg的方式启动了,端口为8787。
2.设置你的extension项目为remote debug模式(以eclipse为例):
自己已经写好了一个简单的Extension项目,并且打好了jar包在extension的一个新建目录下面,在smartfox的zone setting里面配置好了(具体写法以及配置方法参见官方的Extension教程):
---------------我的一个简单的服务器端求和扩展程序源码
package com.funyuto.extensiontest;
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) {
        // TODO Auto-generated method stub
        int numA = sfsobj.getInt("NumA");
        int numB = sfsobj.getInt("NumB");
        
        SFSObject objout = new SFSObject();
        objout.putInt("NumC", numA+numB);
        send("SumNumber",objout,user);
    }

}
 
然后打开eclipse,设置这个extension项目的debug模式为remote debug。

具体方法为右键你的项目,打开Debug Configurations后双击Remote Java Application,然后在右边栏目中填入如下信息:

Name: 可以随便

Project:指定到你要调试SmartFoxServer2x的Java扩展项目。

Connection Type: Standard (Socket Attach)

Host: localhost (如果服务器不在本地,那么就填服务器IP地址。)

Port: 8787 我们上面设置remote debug时指定的端口号。

然后点击Apply即可。

 
点击Debug 便能进入remote Debug模式了,我们打开eclipse 的debug视图,可以看到所有熟悉的debug选项。表明连接上了smartfox jvm。
OK,我们可以随心所欲的Debug Extension了,在Extension中打一个断点试试:
你会发现并木有进入断点,这是为嘛呢?因为smartfox并没有事件触发这个Extension呀!在客户端调用你的Extension试试,我以Unity为例,在连接smartfoxserver时,发送一个extension response 给这个扩展程序:
using UnityEngine;
using System.Collections;
using Sfs2X;
using Sfs2X.Core;
using Sfs2X.Requests;
using Sfs2X.Entities.Data;

public class SmartFoxConnect : MonoBehaviour {
    public string ServerIP = "127.0.0.1";
    public int ServerPort = 9933;
    public string UserName = "";
    private string ZoneName = "BasicExamples";
    SmartFox sfs;
    // Use this for initialization
    void Start () {
        sfs = new SmartFox();
        sfs.ThreadSafeMode = true;
        sfs.AddEventListener(SFSEvent.CONNECTION,onConnect);
        sfs.AddEventListener(SFSEvent.LOGIN,onLoginSuccess);
        sfs.AddEventListener(SFSEvent.LOGIN_ERROR, onLoginError);
        sfs.AddEventListener(SFSEvent.EXTENSION_RESPONSE,onExtensionResponse);
        sfs.Connect(ServerIP, ServerPort);
    }
    void onLoginSuccess(BaseEvent e) {
        Debug.Log("login success!"+e.Params["user"]);
       
        ISFSObject obj = new SFSObject();
        obj.PutInt("NumA",2);
        obj.PutInt("NumB",5);
        sfs.Send(new ExtensionRequest("SumNumbers",obj));    
    }
    void onExtensionResponse(BaseEvent e) { 
        string cmd = (string)e.Params["cmd"];
        ISFSObject objIn = (SFSObject)e.Params["params"];

        if(cmd == "SumNumber"){
            Debug.Log("Sum:"+objIn.GetInt("NumC"));
        
        }
    }
    void onLoginError(BaseEvent e)
    {
        Debug.Log("login faild!" + e.Params["errorCode"]+":"+e.Params["errorMessage"]);
    }
    void onConnect(BaseEvent e) {
        if ((bool)e.Params["success"])
        {
            Debug.Log("Successfly Connect!");
            sfs.Send(new LoginRequest(UserName,"",ZoneName));
        }
        else {

            Debug.Log("Connect Faild!");
        }
    }
    // Update is called once per frame
    void Update () {
        sfs.ProcessEvents();
    }
}

简单的把脚本绑定到MainCamera运行,当unity游戏连接到smartfox服务器,并向指定Extension发送了请求时,我们会发现eclipse上的项目进入了断点!OK,成功了!

enjoy!!

原文地址:https://www.cnblogs.com/funyuto/p/3068096.html