spring boot的websocket五种实现方式

原理

websocket是一种强连接+双工信道的技术,强连接是指:前后端之间,不是http那种无状态的单次请求,单次响应的交互模式,而是强后端之间(其实是浏览器和服务器之间)建立socket信道,前端可以向着信道写入消息,后端也是。而双工信道指的是,服务器不是被动等待响应,而是可以主动发送信息给浏览器,因为信道已经建立起来了,服务器也找得到客户端的地址了。同时,由于建立了信道,浏览器和客户端的每一次交互都可以在信道中记录下来,这样,就可满足一些需要针对不同单用户记录每次状态的场景了。如果想更加具体的了解使用websocker,可以查询其他的博客,本篇博客主要是解释实现方式。

顺便补充一下websocket的升级过程
  1. 首先,websocket的底层还是tcp/ip的结构,它是http协议升级而来的。所以,WebSocket是基于Http协议的,或者说借用了Http协议来完成一部分握手,在握手阶段与Http是相同的。
  2. 升级过程就是首先,http的头部携带了对应的:
GET /chat HTTP/1.1                        //请求行
Host: server.example.com                  //请求头  
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

这5个字段,以此完成升级。
其中,前两个不用过多解释了,第三个是一个随机生成的秘钥,用于验证连接的端口对应处理程序是不是websocket服务器。能否解析这个字段。而后Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议,提供多个的时候,由服务器选择其中一个。最后就是确定websocket的版本。
而后服务器完成升级,会返回消息:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

其中Sec-WebSocket-Protocol是服务端最后选择的协议,而Sec-WebSocket-Accept则是解密了浏览器的秘钥后,返回的信息。浏览器也可以自己解开。

Sec-WebSocket-Accept和Sec-WebSocket-Key的加密解密过程
  1. 浏览器随机生成Sec-WebSocket-Key ,提供基本的防护,防止恶意或者无意的连接。
  2. 服务器接收到了key后,将其和 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接;通过 SHA1 计算出摘要,并转成 base64 字符串。
springboot的五种websocket连接方式demo:
  1. 方式1是javaEE7原生的websocket:
  • 参考1:一个简单的介绍,排版不友好,不过相对较详细
  • 参考2,也是javaEE原生,比起参考1,排版好点,但是只有后端,前端用的只是一个在线websocket测试的东东。
  • 参考3,这个是个群聊聊天室demo,前后端都有了,用的也是原生websocket可以参考一下。
  1. 方式2是springboot注解使用websocket,其实底层也是java原生websocket,只是加了一层封装而已
  2. 方式3是Netty框架实现的websocket,这里的封装更加好,而且netty框架的话,本身的异步机制实现更加完善。
  3. 方式4是使用stomp,类似消息队列的方式实现的websocket,搞定广播和主动推送。
  4. 方式5,tio方式
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值