WebSocket初体验(Netty)
- 需求场景:
项目环境:Linux+Java+SpringMVC+JavaScript
需求:项目为B/S架构,现需求在用户A进行操作时将A的操作信息同步给用户B
问题:由于项目是B/S架构,使用http协议通信,基于http协议,服务器无法直接向客户端推送消息 - 解决方案:
选型:综合考虑,可行方案基本在Ajax轮询及WebSocket间徘徊,考虑到性能问题以及可以炒一下H5的冷饭,所以选择了WebSocket
最终技术选型为: Netty 3.10.6.Final(由于看到相关资料谈及Netty的新版本不太稳定,所以在选型时选择了相对稳定的3.10.6.Final版本)
Netty介绍及官网: [ 介绍 ] [ 官网 ]
选型时出于性能考虑,参考了以下文档:
http://blog.csdn.net/langzi7758521/article/details/51307293
Netty和Node.js在Websocket的性能上,都有良好的表现,至于为什么最后选择了Netty?
嗯,因为名字好听一点. - 代码实现:
出于保密协议和职业道德关系,并没有把写过的代码带出来,所以这里概述一下实现方案,后续会将代码更新在个人的Git上并补上链接.
代码参照Netty原生example修改:
https://github.com/netty/netty/tree/netty-3.10.6.Final/src/main/java/org/jboss/netty/example/http/websocketx
实现方案:
1.系统启动时,服务端绑定要监听的WebSocket端口
2.在用户登入系统时,通过前端JS代码与服务器监听的端口建立连接,这里需要注意的是,WebSocket的连接建立是需要消耗时间来进行握手和协议升级的,所以在通常条件下,JS脚本中新建立的连接直接用来发送消息是会出现异常的,建议在发消息前判断一下readyState,当readyState==1时再进行消息发送
3.用户进行操作时,将操作信息发给服务器,服务器判断消息内容后,将信息推送给已建立连接的客户端
4.采用消息队列对操作信息的接收及发送进行管理 - 后记:
后续实际应用过程中发现,部分华为手机在使用时,客户端无法与服务器正常握手建立连接,所以此类设备在使用时无法接收到推送信息,所以意识到当时的选型是有问题的,只考虑了性能,没有考虑到设备的支持相关问题,所以将选型更新为:SockJS+Netty 3.10.6.Final双模式,由于不可用的设备数量较小,在WebSocket不支持的情况下,可以采用SockJS模拟WebSocket来实现浏览器和 Web 服务器之间低延迟、全双工、跨域的通讯通道.