这些天来一直用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!!