赞
踩
Websocket实现了“服务器”主动向“客户端”发送数据,改变了以往通过轮询、长轮训、长连接等方式获取服务器端数据的方式。
一、Websocket有三种不同的用场景,单播、广播和组播;
(一)、单播(Unicast)
单播是客户端与服务器之间的“一对一”的连接。是在一个单个的发送者和一个接收者之间通过进行的通信。
(二)、广播(Broadcast)
广播是服务器与客户端“一对所有”的连接方式。广播意味着服务器向每一个成员都投递一份数据包,不论这些主机是否乐于接收该数据包。
(三)、组播(Multicast)
组播是在服务端和客户端之间实现“一对一组”的连接方式。服务器可以向某些用户发送特定信息。
二、Springboot框架集成Websocket
(一)、原生注解
引入Websocket包后,重写WsServerEndpoint配置类,内置方法包括Onopen、Onclose和OnError等方法。服务端发送消息必须通过 Session 类,通常是在@OnOpen 方法中,当连接成功后把 session 存入 Map 的 value,key 是与 session 对应的用户标识,当要发送的时候通过 key 获得 session 再发送,通过session.getBasicRemote_().sendText(_) 来对客户端发送消息。
(二)、Spring封装
引入Websocket包后,通过继承 TextWebSocketHandler 类并覆盖相应方法,可以对 Websocket 的事件进行处理。重写的方法与原生注解中有一一对应。
(三)、Tio
Tio-websocket-server 是基于Tio的Websocket协议的实现,也是通过实现接口覆盖方法来进行事件处理,实现的接口是IWsMsgHandler。Tio-websocket-server无缝对接点对点发送消息,群组消息,客户端连接维护等。所以,基于 tio-websocket-server 的 starter,在使用起来不必关心连接的维护问题,只要做好业务处理即可。在拥有了Tio的便利性的同时又可以使用Spring的各种特性,极大的简化了Spring + Websocket 的开发难度。
(四)Stomp
WebSocket 协议是基于 TCP 的一种新的网络协议,实现双工通讯,但是 Websocket 没有规范Payload (除控制信息外的有效载体)格式,可以是文本数据,也可以发送二进制数据,需要我们自己定义。而我们可以使用 Stomp 协议去规范传输数据格式标准。
Stomp是通过实现 WebSocketMessageBrokerConfigurer 接口和加上@EnableWebSocketMessageBroker来进行 stomp 的配置与注解扫描。一些方法的重写可以实现广播、消息发送等功能。
综上所述,实现Websocket的方式有四种,其中原生Websocket需要自己做更多的配置和重写代码。Spring集成与原生的类似,同样需要自己做配置和重写代码,包括重写实现类,Session的管理和拦截器的布置等。在内网内使用,业务固定,只是简单的服务器双向通信,推荐 Stomp 的形式,因为Stomp 更容易规范使用。
服务器如果要主动发送消息给客户端一定要用到 session。而 session 是不跨 Jvm 的。如果有多台服务器,在 http 请求的情况下,可以通过把 session 放入缓存中间件中来共享解决这个问题。但是 Websocket不可以,因为Websocket的 session 是不能序列化的。
目前可以通过 redis 订阅广播的形式解决如上问题,在本地放个 map 保存请求的 session。也就是说每台服务器都会保存与他连接的 session 于本地。然后发消息通过 redis 的订阅机制。服务器要发消息的时候,通过 redis 广播这条消息,所有订阅的服务器都会收到这个消息,然后服务器再发送消息给客户端。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。