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中配置的 extensionThreadPoolSettings(Ext),老版本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中配置的 extensionThreadPoolSettings(Sys),老版本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 的源码
相关推荐
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)
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
目录 01-配置接口.exe 02-配置管理.exe 03-设备重启.exe 04-软件升级.exe 05-特征库升级.exe 06-配置PPPoE.exe 07-配置NAT-动态地址转换.exe 08-配置NAT-静态地址转换.exe 09-配置NAT-内部服务器.exe ...
目录 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 使用说明 ....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
安装详见“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~...
4. **坐标转换**:PyGeodesy支持多种坐标系统间的转换,例如从经纬度到UTM(通用横轴墨卡托投影),或者从笛卡尔坐标到极坐标。 5. **地球重力计算**:库内包含计算地球表面或任何给定点的重力加速度的函数,这对于...
3. **大地坐标转换**:PyGeodesy支持多种坐标系统之间的转换,如经纬度、UTM(通用横轴墨卡托)、Geocentric坐标等。 4. **垂直曲率和水平曲率**:地球并非完美的球体,而是椭球体,因此在不同位置,曲率会有所不同...
adb(Android Debug Bridge)是Android开发中的一个关键工具,它是一个命令行实用程序,允许开发者与Android设备进行通信。在“adb-platform-tools_r34.0.4-windows.zip”这个压缩包中,包含了适用于Windows平台的...
1. **坐标系统转换**:PyGeodesy支持多种坐标系统的转换,包括地理坐标(经度和纬度)、UTM(通用横轴墨卡托)坐标、以及ENU(东、北、上)局部坐标系。这些转换在处理全球定位数据时至关重要,因为不同的地理位置...
FortiOS是一个集成的安全操作系统,广泛应用于防火墙、统一威胁管理(UTM)设备、虚拟安全网关等场景。通过`fortiosapi`,开发者可以编写Python脚本,实现对FortiOS设备的自动化配置、状态查询、策略更新等功能,极大...
包括从WGS84(世界大地坐标系统)到其他坐标系,如UTM(通用横轴墨卡托坐标系)和地方坐标系的转换。 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....
3. **坐标转换**:PyGeodesy支持不同坐标系统的转换,包括经纬度、UTM(通用横轴墨卡托)、GEODetic和ELLIPSOID坐标系之间的转换,方便在不同系统间进行数据交换。 4. **地球椭球参数**:库内包含了多种地球椭球...
1-104121203-blog-117118786.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-1-104121203-blog-117118786.235%5Ev43%...
1. **坐标系统支持**:Cartopy 支持多种地理坐标系统,包括经纬度网格、UTM、国家平面坐标系统等,允许用户在不同的坐标系之间转换。 2. **地图投影**:内置了超过40种不同的地图投影方式,如 Mercator、Lambert ...
4. **安全特性**:由于`universalk9`标签,此IOS版本具备了广泛的网络安全功能,包括访问控制列表(ACLs)、状态化包检测(SPD)、统一威胁管理(UTM)、IPSec和SSL加密,以及对最新威胁的防护。 5. **配置与管理**...
教程:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
应用:DFA与DCCA计算 如何自定义下载:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-14.topblog&utm_relevant_index=19
PyProj库提供了接口,可以方便地实现这些转换,同时支持多种投影方法,如UTM、Albers Equal Area等。 这个压缩包"pyproj-1.9.5.1-cp36-cp36m-win_amd64.whl"是针对Python 3.6版本的64位Windows系统编译的二进制发行...