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

8.Utm示例-Netty集成

阅读更多

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 的源码

 

 

 

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

    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~...

    Python库 | PyGeodesy-19.8.26-py2.py3-none-any.whl

    4. **坐标转换**:PyGeodesy支持多种坐标系统间的转换,例如从经纬度到UTM(通用横轴墨卡托投影),或者从笛卡尔坐标到极坐标。 5. **地球重力计算**:库内包含计算地球表面或任何给定点的重力加速度的函数,这对于...

    PyPI 官网下载 | PyGeodesy-19.6.18-py2.py3-none-any.whl

    3. **大地坐标转换**:PyGeodesy支持多种坐标系统之间的转换,如经纬度、UTM(通用横轴墨卡托)、Geocentric坐标等。 4. **垂直曲率和水平曲率**:地球并非完美的球体,而是椭球体,因此在不同位置,曲率会有所不同...

    adb-platform-tools-r34.0.4-windows.zip

    adb(Android Debug Bridge)是Android开发中的一个关键工具,它是一个命令行实用程序,允许开发者与Android设备进行通信。在“adb-platform-tools_r34.0.4-windows.zip”这个压缩包中,包含了适用于Windows平台的...

    PyPI 官网下载 | PyGeodesy-18.8.22-py2.py3-none-any.whl

    1. **坐标系统转换**:PyGeodesy支持多种坐标系统的转换,包括地理坐标(经度和纬度)、UTM(通用横轴墨卡托)坐标、以及ENU(东、北、上)局部坐标系。这些转换在处理全球定位数据时至关重要,因为不同的地理位置...

    Python库 | fortiosapi-0.6.2-py2.py3-none-any.whl

    FortiOS是一个集成的安全操作系统,广泛应用于防火墙、统一威胁管理(UTM)设备、虚拟安全网关等场景。通过`fortiosapi`,开发者可以编写Python脚本,实现对FortiOS设备的自动化配置、状态查询、策略更新等功能,极大...

    PyPI 官网下载 | PyGeodesy-19.7.6-py2.py3-none-any.whl

    包括从WGS84(世界大地坐标系统)到其他坐标系,如UTM(通用横轴墨卡托坐标系)和地方坐标系的转换。 2. **距离计算**:基于不同的地球模型,库中提供了计算两点间大圆距离、平面距离(墨卡托投影)以及最小曲面...

    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....

    Python库 | PyGeodesy-20.12.20-py2.py3-none-any.whl

    3. **坐标转换**:PyGeodesy支持不同坐标系统的转换,包括经纬度、UTM(通用横轴墨卡托)、GEODetic和ELLIPSOID坐标系之间的转换,方便在不同系统间进行数据交换。 4. **地球椭球参数**:库内包含了多种地球椭球...

    Eclipse的C/C++自动补全插件org.eclipse.cdt.ui-7.3.100.202111091601

    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%...

    Cartopy-0.19.0.post1-cp37-cp37m-win-amd64.whl

    1. **坐标系统支持**:Cartopy 支持多种地理坐标系统,包括经纬度网格、UTM、国家平面坐标系统等,允许用户在不同的坐标系之间转换。 2. **地图投影**:内置了超过40种不同的地图投影方式,如 Mercator、Lambert ...

    aliyun-java-vod-upload-1.4.11.zip

    教程:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

    UTM-30操作说明书1611.pdf

    UTM-30操作说明书1611.pdf UTM-30沥青混合料多功能试验机操作说明书是由B&T公司编制的中文操作手册,版本号为V2.0。本手册提供了UTM-30设备的硬件介绍、软件概述、设备启动和关闭、传感器安装、环境箱使用、通用...

    pyproj-1.9.5.1-cp36-cp36m-win_amd64.rar

    PyProj库提供了接口,可以方便地实现这些转换,同时支持多种投影方法,如UTM、Albers Equal Area等。 这个压缩包"pyproj-1.9.5.1-cp36-cp36m-win_amd64.whl"是针对Python 3.6版本的64位Windows系统编译的二进制发行...

    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

Global site tag (gtag.js) - Google Analytics