WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
轮询: 不断地向服务器发送请求,服务器也频繁的被动回应请求;
WebSocket:由服务器向客户端主动发起回应;
详细介绍自行百度啦,这里介绍Springboot如何整合WebSocket,
代码已上传的git:https://github.com/FENGZHIJIE1998/websocket-demo
1. pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2. WebSocketConfig
/**
* @author Dazhi
* @date 2019/4/25 20:40
*/
@Component
public class WebSocketConfig {
/**
* 注入ServerEndpointExporter
*/
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
3. MessageVO
/**
* @author Dazhi
* @date 2019/4/25 20:45
*/
@Data
public class MessageVo {
/**
* 消息生产者ID
*/
private String productorId;
/**
* 消息消费者者ID
*/
private String comsumerId;
/**
* 消息
*/
private String message;
/**
* 生产者昵称
*/
private String nickname;
}
4. WebSocketServer(重点)
/**
* @author Dazhi
* @date 2019/4/25 20:50
*/
@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class WebSocket {
/**
* String : 用户ID
* Session: 回话
*/
public static Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();
/**
* onOpen是当用户发起连接时,会生成一个用户的Session 注意此Session是 javax.websocket.Session;
* 然后我们用userId作为Key Session作为Vaule存入Map中暂存起来
*
* @param userId
* @param session
*/
@OnOpen
public void onOpen(@PathParam("userId") String userId, Session session) {
log.info("====>WebSocketService onOpen: " +