zoukankan      html  css  js  c++  java
  • 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!!

  • 相关阅读:
    Python学习(五)函数 —— 自定义函数
    Python学习(四)数据结构 —— dict
    Python学习(四)数据结构 —— set frozenset
    C++ —— 构建开源的开发环境
    Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(使用语法)
    Web —— tomcat 问题解决
    web —— jsp笔记
    Web 前端 —— javaScript
    编程杂谈—— 浮点数
    Web —— java web 项目开发 笔记
  • 原文地址:https://www.cnblogs.com/funyuto/p/3068096.html
Copyright © 2011-2022 走看看