這些天來一直用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的話,便會看到如下信息:

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); } }
具體方法為右鍵你的項目,打開Debug Configurations后雙擊Remote Java Application,然后在右邊欄目中填入如下信息:
Name: 可以隨便
Project:指定到你要調試SmartFoxServer2x的Java擴展項目。
Connection Type: Standard (Socket Attach)
Host: localhost (如果服務器不在本地,那么就填服務器IP地址。)
Port: 8787 我們上面設置remote debug時指定的端口號。
然后點擊Apply即可。


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