WebSocket Netty实现
netty实现的websocket推送框架
WebSocket Netty实现
目的
业务需求,需要向前端浏览器订阅推送业务,接受后端推送,之前用的是amq.js (activemq基于轮询实现),有很大的性能问题和实时性也无法保证; 所以就使用了 netty 实现了个 Websocket 框架
WebSocket 基于H5实现,低版本IE不支持 (ie8)
有时候需要网页和手机端都要一致推送协议,则手机客户端也可能需要实现websocket推送
WebSocket协议(RFC6455)的翻译和官网描述地址
项目目录以及环境配合
因为是个测试项目,所以可能会有别的框架代码,但是不会影响框架环境,也证明了这个框架是0侵入性的,拷进去就能用
源码说明
1. server 包
netty 的serverBootstrap 的启动与端口监听类
2. handler 包
netty 的channelHandler的实现,主要实现了(通过工厂模式) 用来处理websocket 的请求(http升级,握手,以及对于请求处理)
具体处理逻辑在:WebSocketChannelHandler.java 的 channelRead() 方法中
调用 upgradeResolver 处理http 升级请求,可以处理 uri ,过滤拦截,异常处理
调用 requestHandlerMapping 获取对应uri 的 HandlerAdapter 请求处理类
webSocketCacheManager 整个netty 框架中存储和保活的存储层,里面封装了一层dao层,做好存储框架替换的准备
3. adapter 包
websocket请求握手成功后,服务端和客户端的通信是基于frame 的(data frame 和 control frame)
adapter 包中定义了 HandlerAdapter 接口,三个方法
/* 用来处理客户端发送的数据 */
handleRequest();
/** 服务端处理(或者是推送处理)或者是聊天业务中获取目标对象的id 查找到对应的 HandlerAdapter 和 channel 进行推送聊天消息 **/
handleResponse();
/** 连接完成时调用* */
onUpgradeCompleted();
该接口我实现了2个抽象父类
一. 用来处理control frame 的AbstractFrameHandlerAdapter 因为毕竟大部分的control frame 的处理都是一样的,可以继承它,或者对于特定的frame可以自己重写方法实现
二. KeepAliveHandlerAdapter 用来处理保活,心跳机制的处理类,同上,也是因为几乎所有用websocket的业务都需要这样的处理,所以也可以封装成父类进行实现,具体保活机制在类的注释上
4. chat 和 common 包
这两个包下的实现类,并不属于框架源码,是作者用来测试不同业务的实现
chat 包下是实现聊天业务的实现
common 包下两个类实现了不同的推送订阅的处理
源码目录
该项目是基于netty spring maven 的 jdk1.8
netty maven地址:
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.11.Final</version>
</dependency>
项目中有个 spring 容器,只需要在应用(或者web 应用)中的spring 上下文引入websocket 的配置即可启动:
<import resource="./spring-netty-websocket.xml"/>
源码位置:
所有源码都在这个包下
com.java.core.netty.websocket
注意:
源码包中的
chat 与 common 包,是具体业务的实现!!(example)
还有个测试的service类,用来测试推送业务,即开启定时器,向订阅的客户端发送对应的推送内容 WebSocketTestService.java
com.java.service.WebSocketTestService.java
spring-netty-websocket.xml 文件就是 netty-websocket的实现,其中对于websocket 网络请求的操作业务类,都由spring 容器进行管理
业务示例
当前浏览器页面(或者android / ios)上遇到的需要使用到 websocket 的业务 1.聊天 2.推送信息
项目中也大致的实现了这些功能
聊天
com.java.core.netty.websocket.chat 包下
ChatHandlerAdapter.java 类用来实现聊天业务:
前端发送对方的id (可以是channelId ,或者与channelId关联的任何key ,最后都要通过channelId 找到具体的对方也就是接收方的channel ,发送聊天消息)
ChatOnlineListHandlerAdapter.java 类用来实现,聊天人员的列表推送,使得前端有实时的在线人员进行选择,发送数据
当然这两个业务放在同一个处理类下进行处理是没有问题的
推送
例子:
com.java.service.WebSocketTestService.java 中
的
frameHandlerAdapter.handleResponse(frameParams);
和
locationHandlerAdapter.handleResponse(locParams);
用来推送服务端消息
本来项目
安全
netty 中实现websocket 权限
因为很多应用都是部署在tomcat 用tomcat的过滤器进行权限验证
而 netty 服务是监听另一个端口(如38888)则会存在安全访问问题
- 首先服务器设置orign 请求头
方案1:
请求 websocket 前可以先通过 ajax 请求,后台登陆权限成功通过生成一个 key ,返回前端,前端发起 websocket 请求带上这个token,然后后台就可以验证身份了
方案2:
反向代理 在web.xml 中配置一个自定义的Filter 在权限验证后,判断是否 websocket请求,然后对请求进行反向代理 此方案难度太大,曾经使用nginx lua 模块实现,最后还是不行,网上有通过java实现的反向代理技术,可以试试
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfbjeab
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel图片置于文字下方的方法
PHP中文网 06-27 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22