WebSocket初体验(Netty)

来源:互联网 发布:windows字体库样式 编辑:程序博客网 时间:2024/06/02 05:03

WebSocket初体验(Netty)

最近实在有点闲,鉴于实在拿不出”没时间”作为理由让自己休息休息,另外Maybe人生将踏入一个新的阶段,决定开始写博客,总结下之前做过的东西,分享的同时加深一下记忆.

  • 需求场景:
    项目环境: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 服务器之间低延迟、全双工、跨域的通讯通道.
原创粉丝点击