Utm示例-Netty集成
在各个平台上集成utm主要是通过一个过滤器将该平台收到的信息转发到utm里,由utm线程调度处理。
Netty4(4.1.0.Beta5)
一个Java写的基于NIO的客户,服务器端编程框架,这里就不介绍关于Netty的基本内容了,只是关注如何在Netty4上集成utm。(这次是本人刚接触Netty,所以可能对于其中的一些细节不甚了解,如果有什么不对的地方希望大家提出)。
测试代码中前后端交互的编码使用了 netty自带的长度LengthFieldxxx和自己定义的消息体编码CommonObjB(这里就不做详细介绍);而客户端采用的是java写的一个简单的Socket处理(BIO),使得代码相对更加简洁易懂,而且比较容易移植到其他语言上(当然把它改成NIO是很容易的事情,不过如果只是和一个服务端通信,其实客户端并不太需要做这种改变)。
相关的代码:GitHub: https://github.com/dga4654dan/UTM-DEMO下的 V_1_0_1 下的 UtmDemo_Netty_4.1.0.Beta5
或 Git@OSC: http://git.oschina.net/daemon_c/UTM-demo下的 V_1_0_1 下的 UtmDemo_Netty_4.1.0.Beta5
首先在Netty的ChannelInitializer中实例化utm,对应MainHandlerInitializer类,在该类里的构造方法中实例化utm:
(如上提及的“实例化utm”)
然后是在Netty的消息控制器(MainHandler)将信息转发到utm上:
(在Netty上给定的接口是基于连接的,就是:一个连接 连接上了,连接 断开了,连接 发送来消息了,而utm也并不包含连接与用户的映射关系(在“Utm详细实现 ->用户生命流程 -> 用户登录 -> 详细流程 -> 关于为什么要有loginLinkCheck问题”中已有说明),所以这部分内容需要外围的程序实现,封装在了ControlCenter中(可以查看该具体类方法的说明和实现))
MainHandler:
1.连接 连接到服务端,这里utm并不做处理,只是记录连接信息(ControlCenter.visitorLink)
publicvoid channelActive(ChannelHandlerContext ctx)throws Exception {
//客户端连接到服务
Channelchannel = ctx.channel();
ChannelIdchannelId = channel.id();
Stringaddress = channel.remoteAddress().toString();
Stringip = address.substring(1, address.indexOf(':'));
//将连接信息(Link)放入到linkMap
ControlCenter.visitorLink(channelId,channel, ip);
super.channelActive(ctx);
}
2.连接断开,如果该连接对应一个客户,则调用utm的客户断线方法(userThreadModeFilter.disconnect)
publicvoid channelInactive(ChannelHandlerContext ctx)throws Exception {
//客户端断开连接
ChannelIdchannelId = ctx.channel().id();
IntegeruserId = ControlCenter.disconnect(channelId);
//如果是用户则调用utm的用户断线事件
if( userId !=null ) {
Useruser = ControlCenter.getUser( userId );
if( user !=null ) {
LoggerCenter.userRquestLogger.log(user.userName,
LoggerCenter.getBeforeInfo().append("cmd:netty user disconnect\n") );
userThreadModeFilter.disconnect(requestIds.getAndIncrement(), userId);
}
}
}
3.接收到连接的消息,如果该连接是用户则调用utm的用户cmd请求处理方法(userThreadModeFilter.handleUserRequest),如果该连接是游客则调用utm的游客cmd请求处理方法(userThreadModeFilter.handleVisitorRequest)。
protectedvoid channelRead0(ChannelHandlerContext ctx, ByteBuf buf)throws Exception {
//接收到客户端消息
ChannelIdchannelId = ctx.channel().id();
Linklink = ControlCenter.getLink(channelId);
IntegeruserId = link.getUserId();
//解析请求参数
Integercmd = cmdCoder.decoder(buf);
CommonObjBparam = decoder.decoder(buf);
if( userId ==null ) {
//处理游客请求
userThreadModeFilter.handleVisitorRequest(requestIds.getAndIncrement(), cmd, channelId, link.visitor, param);
} else {
//如果是断开,则设置连接信息(Link)为断开
if( cmd ==Cmd.Logout.CMD )
link.logout();
//处理用户请求
userThreadModeFilter.handleUserRequest(requestIds.getAndIncrement(), cmd, userId, param);
}
}
再来看下一个前后端简单的交互过程(HeartbeatHandler心跳):
由客户端发给服务端,带有一个requestCode参数,服务端接收到并返回该参数。
服务端:(HeartbeatHandler)
服务端处理器只需要实现IRequestHandler接口即可,由于该接口方法较多,所以直接继承了一个实现了部分方法的实现类,通常的cmd处理器只需要继承它并实现handlerUserRequest和queueFull即可。
publicvoid handlerUserRequest(int requestId, User user, CommonObjB param) {
//给用户返回心跳信息
try {
//获得请求参数
int requestCode = param.getInt(Cmd.Heartbeat.REQUEST_CODE);
//给用户返回信息
CommonObjB returnObject =new CommonObjB();
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) {
CommonObjB returnObject =new CommonObjB();
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_Netty_4.1.0.Beta5\UtmDemo_Netty_4.1.0.Beta5_Client 项目的ClientTest)
发送:
publicvoid sendHeartBeat(int requestCode) {
CommonObjB heartbeat =new CommonObjB();
heartbeat.putInt(Cmd.Heartbeat.REQUEST_CODE, requestCode);
client.send(Cmd.Heartbeat.CMD, heartbeat);
}
接收:(此处仅简单的打印出收到的信息)
publicvoid cmdResponse(Integer cmd, CommonObjB obj) {
System.out.println(prefix + "cmd:" + cmd + ": " + obj.toString() );
}
运行效果:
左边为服务端,可以看到有关资源数量的打印:原来为0,后面客户端连上后变为1
右边是客户端,可以看到
1.登录成功后服务端返回的cmd:Login,其中参数1=0(resultCode=SUCCESS)
2.客户端给后台发送心跳后后台的返回cmd:-1006(心跳),其中参数1=0(resultCode=SUCCESS),101=n(请求参数=n)
也可以在服务端的用户日志中看到该用户和后台的交互日志:
更多细节可以查看NettyUserThreadMode_V_0.9.0 和 NettyUserThreadModeTest_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
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....
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%...
教程:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
安装详见“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~...
资源分类:Python库 所属语言:Python 资源全名:utm-0.3.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
数据源:...应用:DFA与DCCA计算 如何自定义下载:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-14.topblog&utm_relevant_index=19
The Postman app postman-linux-x64.tar.gz 官方 2022.09.14 下载 Linux 64 bit 因网络不方便, 下载官方版的放此 出处: https://www.postman.com/downloads/?utm_source=postman-home
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...
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
mac windows
CentOS 6内核4.4.210版本,稀缺资源,目前网上已经很难找到了。需要升级CentOS 6内核的可以下载,参见笔者博文https://blog.csdn.net/witton/article/details/119710481?utm_source%20=%20uc_fansmsg。
使用utm虚拟机虚拟化Windows10 的必备组件1
用法LatLng-> UTM 在任何L.LatLng对象中调用方法utm()以获取UTM坐标对象。 方法toString会将其无缝转换为字符串。 例如,要在标记中创建弹出窗口: marker . bindPopup ( 'UTM: ' + marker . getLatLng ( ) . utm ( ...
直接与Facebook和Twitter共享-通过Bit.ly集成缩短UTM-将所有链接和用户活动保存到您的帐户中通过有效地生成Google Analytics(分析)跟踪链接(又称为UTM跟踪代码)来节省时间离开您的Chrome浏览器。 免费获取您的...
UTM文件