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!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM