`
daemon_chen
  • 浏览: 3675 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

7.Utm示例-SmartFoxServer集成

阅读更多

Utm示例-SmartFoxServer集成

 

在各个平台上集成utm主要是通过一个过滤器将该平台收到的信息转发到utm里,由utm线程调度处理。

 

SmartFoxServer(这里测试使用的是2.9.0版本(在商用稳定运行的是2.7.0,由于该版本已经比较老所以这里没有使用))

一个Java写的跨平台socket服务端(收费),它已经实现了在很多平台上的客户端api(flash、html5、ios、android等),开发起来比较便捷,这里就不介绍关于smartFoxServer的基本内容了,只是关注如何在sfs上集成utm。(在sfs上的utm是经过一定商用环境的测试,稳定运行的)

 

相关的代码:GitHub: https://github.com/dga4654dan/UTM-DEMO下的 V_1_0_1 下的 UtmDemo_Sfs_2.9.0

或 Git@OSC: http://git.oschina.net/daemon_c/UTM-demo下的 V_1_0_1 下的 UtmDemo_Sfs_2.9.0

 

(运行SmartFoxServer需要使用它自带的jdk,在其目录下的jre目录(主要是其jetty对jdk版本要求较高,也可以把它关掉,修改config目录下的server.xml下的webSocket))

 

 

首先创建一个名为GameServer的Extension,对应GameServerExtension类,在该类里的静态块实例化utm:

(如 Utm示例-公共部分 提及的“实例化utm”)

 

 

然后在GameServerExtension中添加过滤器(SfsUserRequestFilter)和处理器:

/**

* 添加sfs过滤器

*/

privatevoid addFilter() {

 

//UTM过滤器(拦截用户请求改由utm负责处理,拦截用户登录断线等请求改由utm处理)

addFilter("SynchronousControl",new SfsUserRequestFilter(userThreadMode.getUserThreadModeFilter()));

}

 

/**

* 添加sfs事件监听器

*/

privatevoid addEventHandler() {

 

//用户登陆事件(实际上并没有调用,但是必须存在,否则sfs不会派发该事件(SfsUserRequestFilterl拦截不到))

addEventHandler(SFSEventType.USER_LOGIN, OnUserLoginHandler_Old.class);

//用户断线事件(实际上并没有什么处理,但是必须存在,否则sfs不会派发该事件(SfsUserRequestFilterl拦截不到))

addEventHandler(SFSEventType.USER_LOGOUT, OnUserGoneHandler.class);

//用户断线事件(实际上并没有什么处理,但是必须存在,否则sfs不会派发该事件(SfsUserRequestFilterl拦截不到))

addEventHandler(SFSEventType.USER_DISCONNECT, OnUserGoneHandler.class);

// 服务器启动完毕事件

addEventHandler(SFSEventType.SERVER_READY, OnServerReadyHandler.class);

}

 

 

 

下面来看下sfs过滤器(SfsUserRequestFilter)的实现:

 

1.直接拦截用户请求改由utm负责处理(返回FilterAction.HALT)

publicFilterAction handleClientRequest(String cmd, User user, ISFSObjectparams) throws SFSException {

//拦截用户请求改由utm负责处理

//调用该方法的线程池是在server.xml中配置的 extensionThreadPoolSettingsExt),老版本sfs则是在 server.xml中的extensionControllerThreadPoolSize

Integer userId = (Integer)user.getProperty(Cmd.Login._USER_ID);

userThreadModeFilter.handleUserRequest(requestIds.getAndIncrement(),cmd, userId, params);

return FilterAction.HALT;

}

 

2.拦截sfs的系统事件转发给utm处理

public FilterAction handleServerEvent(ISFSEvent event)throws SFSException {

/拦截用户登录断线等请求改由utm处理

//调用该方法的线程池是在server.xml中配置的 extensionThreadPoolSettingsSys),老版本sfs则是在 server.xml中的systemControllerThreadPoolSize

switch (event.getType()) {

caseUSER_LOGIN:

//用户登录

ISession session = (ISession)event.getParameter(SFSEventParam.SESSION);

int sessionId = session.getId();

 

Visitor visitor = new Visitor(session, session.getAddress());

userThreadModeFilter.handleVisitorRequest(requestIds.getAndIncrement(), Cmd.Login.CMD, sessionId,visitor, event);

 

//抛出SfsStopLoginException,阻止sfs登录流程继续走下去(如果返回FilterAction.HALT,则前端会受到 loginError的回调,所以这里用异常阻止)

//请不要尝试在这里抛出SFSLoginException,否则前端会认为登录失败

thrownew SfsStopLoginException();

caseUSER_DISCONNECT:

caseUSER_LOGOUT:

//用户断线或者注销

User sfsUser =(User)event.getParameter(SFSEventParam.USER);

 

Integer userId =(Integer)sfsUser.getProperty(Cmd.Login._USER_ID);

com.dc.sfs.obj.User user =ControlCenter.getUser(userId);

if( user !=null ) {

 

LoggerCenter.userRquestLogger.log(sfsUser.getName(),

LoggerCenter.getBeforeInfo().append("cmd:sfs user disconnect and execute utmdisconnect\n") );

 

userThreadModeFilter.disconnect(requestIds.getAndIncrement(), user);

 

} else {

 

LoggerCenter.userRquestLogger.log(sfsUser.getName(),

LoggerCenter.getBeforeInfo().append("cmd:sfs user disconnect only !\n") );

}

break;

default:

break;

}

return FilterAction.CONTINUE;

}

 

再来看下一个前后端简单的交互过程(HeartbeatHandler心跳):

由客户端发给服务端一个请求,带有一个requestCode参数,服务端接收到并返回该参数

(在sfs里实现心跳机制,可以前端每n秒发送一个心跳给后台,前端可以根据a*n秒没有收到回复后认为已经和服务端断开,而服务端sfs可以将extension配置文件中的overrideMaxUserIdleTime为a*n秒则在a*n秒内没收到前端的任何消息就会断掉该用户,在服务端并不需要开发者处理)

 

服务端:(HeartbeatHandler)

服务端处理器只需要实现IRequestHandler接口即可,由于该接口方法较多,所以直接继承了一个实现了部分方法的实现类,通常的cmd处理器只需要继承它并实现handlerUserRequest和queueFull即可。

publicvoid handlerUserRequest(int requestId, User user, ISFSObject param) {

//给用户返回心跳信息

try {

//获得请求参数

int requestCode = param.getInt(Cmd.Heartbeat.REQUEST_CODE);

 

//给用户返回信息

SFSObject returnObject =new SFSObject();

returnObject.putInt(Cmd.Heartbeat._RESULT_CODE,Cmd.SuccessCode.SUCCESS);

returnObject.putInt(Cmd.Heartbeat._REQUEST_CODE, requestCode);

ControlCenter.sendToUser(Cmd.Heartbeat.CMD, returnObject,user);

} catch (Exception e) {

 

SFSObject returnObject =new SFSObject();

returnObject.putInt(Cmd.Heartbeat._RESULT_CODE, Cmd.ErroCode.UNKNOW);

ControlCenter.sendToUser(Cmd.Heartbeat.CMD, returnObject,user);

 

LoggerCenter.userRquestLogger.log(user.userName, e);

}

}

 

客户端:(UTM-Demo\V_1_0_1\UtmDemo_Sfs_2.9.0\UtmDemo_Sfs_2.9.0_Client项目的SfsClientTest)

发送:

publicvoid sendHeartBeat(int requestCode) {

 

ISFSObject param = new SFSObject();

param.putInt(Cmd.Heartbeat.REQUEST_CODE, requestCode);

 

smartFox.send(new ExtensionRequest(Cmd.Heartbeat.CMD, param));

}

 

接收:(此处仅简单的打印出收到的信息)

 

 

运行效果: SmartFoxServer 的启动类为:com.smartfoxserver.v2.Main

左边为服务端,可以看到有关资源数量的打印:原来为0,后面客户端连上后变为1

右边是客户端,可以看到

1.登录成功后服务端返回的cmd:Login,其中参数A=0(resultCode=SUCCESS)

2.客户端给后台发送心跳后后台的返回cmd:heartbeat(心跳),其中参数A=0(resultCode=SUCCESS),C=n(请求参数=n)

 

也可以在服务端的用户日志中看到该用户和后台的交互日志:

 

 

更多细节可以查看SfsUserThreadMode_V_0.9.0 和 SfsUserThreadModeTest_V_0.9.0 的源码

 

 

 

 

 

1. Utm简介

2. Utm 模块设计

3. Utm详细实现-用户生命流程

4. Utm详细实现-用户资源管理

5.Utm线程模型

6. Utm示例-公共部分

7. Utm示例-SmartFoxServer集成

8. Utm示例-Netty集成

 

 

分享到:
评论

相关推荐

    802.11-2012.pdf.rar

    IEEE 802.11-2012版本协议文档 The current revision, IEEE Std 802....— IEEE Std 802.11uTM-2011: Interworking with External Networks (Amendment 9) — IEEE Std 802.11sTM-2011: Mesh Networking (Amendment 10)

    华为HCIE-Security基础篇和高级篇培训视频教程.rar

    1-课程介绍.mp4,网盘文件 2-防火墙简介.mp4 3-安全策略及状态监测.mp4 4-源NAT.mp4 5-目的NAT双向NAT-SLB.mp4 6-双机热备(1).mp4 ...utm-应用行为过滤_rec.mkv utm-邮件过滤_rec.mkv utmurl过滤_rec.mkv

    H3C secPath UTM配置视频.zip

    目录 01-配置接口.exe 02-配置管理.exe 03-设备重启.exe 04-软件升级.exe 05-特征库升级.exe 06-配置PPPoE.exe 07-配置NAT-动态地址转换.exe 08-配置NAT-静态地址转换.exe 09-配置NAT-内部服务器.exe ...

    H3C SecPath UTM系列视频配置案例视频与文档.zip

    目录 01-配置接口.exe 02-配置管理.exe 03-设备重启.exe 04-软件升级.exe 05-特征库升级.exe 06-配置PPPoE.exe 07-配置NAT-动态地址转换.exe 08-配置NAT-静态地址转换.exe 09-配置NAT-内部服务器.exe ...

    mysql-5.7.38-winx64.zip

    mysql-5.7.38-winx64.zip 使用说明 ....pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-120140475-null-null.185^v2^control&utm_term=mysql&spm=1018.2226.3001.4450

    oracle-instantclient11.2

    oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-odbc-11.2....

    Git-2.33.0.2-x64-bit

    安装详见“https://blog.csdn.net/Passerby_Wang/article/details/120767020?ops_request_misc=&request_id=&biz_id=102&utm_term=git%202.33.0.2&utm_medium=distribute.pc_search_result.none-task-blog-2~all~...

    MIT- BIH 正常窦性心律数据 nsrdb-16265

    应用:DFA与DCCA计算 如何自定义下载:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-14.topblog&utm_relevant_index=19

    CentOS-7-x86_64-DVD-1810.iso

    CentOS 7.6 国内镜像下载地址.txt CentOS6、7、8下载地址

    Python库 | utm-0.3.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:utm-0.3.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    postman-linux-x64.tar.gz

    The Postman app postman-linux-x64.tar.gz 官方 2022.09.14 下载 Linux 64 bit 因网络不方便, 下载官方版的放此 出处: https://www.postman.com/downloads/?utm_source=postman-home

    android-studio-ide-173.4720617-linux.zip

    jdk可以在https://download.csdn.net/download/tan3739/9476680?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158787025919725219940697%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fdownload.%2522%257D&request_id=158787025919725219940697&biz_id=1&utm...

    .NET Core sdk-3.0.100-win-x86

    core sdk-3.0.100-win-x86 .NET Core 3.0 管网下载地址 https://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral

    utm3-1-5.dmg

    mac windows

    kernel-lt-4.4.210-1.el6.elrepo.x86-64.rpm

    CentOS 6内核4.4.210版本,稀缺资源,目前网上已经很难找到了。需要升级CentOS 6内核的可以下载,参见笔者博文https://blog.csdn.net/witton/article/details/119710481?utm_source%20=%20uc_fansmsg。

    Leaflet.UTM:用于L.LatLng的简单UTM(WGS84)方法

    用法LatLng-> UTM 在任何L.LatLng对象中调用方法utm()以获取UTM坐标对象。 方法toString会将其无缝转换为字符串。 例如,要在标记中创建弹出窗口: marker . bindPopup ( 'UTM: ' + marker . getLatLng ( ) . utm ( ...

    Effin惊人的UTM建设者「Effin Amazing UTM Builder」「UTM.io - Formerly Effin Amazing UTM Builder」「UTM.io - Google Analytics URL Builder」-crx插件

    直接与Facebook和Twitter共享-通过Bit.ly集成缩短UTM-将所有链接和用户活动保存到您的帐户中通过有效地生成Google Analytics(分析)跟踪链接(又称为UTM跟踪代码)来节省时间离开您的Chrome浏览器。 免费获取您的...

    spice-guest-tools-0.164.3.iso

    使用utm虚拟机虚拟化Windows10 的必备组件1

    DevExpress gridview下拉框repositoryItemComboBox的使用

    DevExpress gridview下拉框repositoryItemComboBox的使用...

    tensorflow_gpu-2.8.0-cp39-cp39-win_amd64.whl

    使用pip在线安装下载很慢,并且下载到中途还有可能失败,所以给大家提供一个CSDN下载地址。下载下来之后的本地安装方法见博文...

Global site tag (gtag.js) - Google Analytics