怎么在SpringBoot中使用WebSocket实现前后端消息互传

  介绍

今天就跟大家聊聊有关怎么在SpringBoot中使用WebSocket实现前后端消息互传,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强>什么是WebSocket吗?

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(全双工)通信——允许服务器主动发送信息给客户端。

怎么在SpringBoot中使用WebSocket实现前后端消息互传”>,</p> <p> <强>为什么需要WebSocket吗?</强> </p> <p>大家都知道以前客户端想知道服务端的处理进度,要不停地使用Ajax进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大。另外一种轮询就是采用长轮询的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一直不返回响应给客户端,连接阶段一直是阻塞的。</p> <p>而WebSocket解决了HTTP的这几个难题。当服务器完成协议升级后(HTTP→WebSocket),服务端可以主动推送信息给客户端,解决了轮询造成的同步延迟问题。由于WebSocket只需要一次HTTP握的手,服务端就能一直与客户端保持通信,直到关闭连接,这样就解决了服务器需要反复解析HTTP协议,减少了资源的开销。</p> <p> <img src=

现在通过SpringBoot集成WebSocket来实现前后端通信。

<强>集成WebSocket实现前后端通信

项目代码结构图

怎么在SpringBoot中使用WebSocket实现前后端消息互传”>,</p> <p> <强>依赖导入</强> </p> <p> SpringBoot2.0对WebSocket的支持简直太棒了,直接就有包可以引入。</p> <pre类= & lt; dependency>,   & lt; groupId> org.springframework.boot,   & lt; artifactId> spring-boot-starter-websocket,   & lt;/dependency>

<强>配置WebSocketConfig

启用WebSocket的支持也是很简单,将ServerEndpointExporter对象注入到容器中。

package  com.tuhu.websocketsample.configuration;      import  org.springframework.context.annotation.Bean;   import  org.springframework.context.annotation.Configuration;   import  org.springframework.web.socket.server.standard.ServerEndpointExporter;   @ configuration   public  class  WebSocketConfig  {   ,@ bean   public 才能;ServerEndpointExporter  serverEndpointExporter (), {   ,,,return  new  ServerEndpointExporter ();   ,,}   }

<>强WebSocket服务端WebSocketServer

因为WebSocket是类似客户端服务端的形式(采用ws协议),那么这里的WebSocketServer其实就相当于一个ws协议的控制器。直接@ServerEndpoint (“/websocket"), @ component启用即可,然后在里面实现@OnOpen, @onClose, @onMessage等方法

package  com.tuhu.websocketsample.controller;   import  lombok.extern.slf4j.Slf4j;   import  org.springframework.stereotype.Component;   import  javax.websocket。*;   import  javax.websocket.server.PathParam;   import  javax.websocket.server.ServerEndpoint;   import  java.io.IOException;   import  java.util.concurrent.CopyOnWriteArraySet;      @ component   @ServerEndpoint (“/websocket/{sid}“)   @Slf4j   public  class  WebSocketServer  {      ,/* *   ,,*,静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。   ,,*/private 才能static  int  onlineCount =, 0;   ,/* *   ,,*,并发包的线程安全,用来存放每个客户端对应的MyWebSocket对象。   ,,*/private 才能static  CopyOnWriteArraySet< WebSocketServer>, webSocketSet =, new  CopyOnWriteArraySet<在();   ,/* *   ,,*,与某个客户端的连接会话,需要通过它来给客户端发送数据   ,,*/private 才能Session 会话;   ,/* *   ,,*,接收sid   ,,*/private 才能;String  sid=?”;   ,/* *   ,,*,连接建立成功调用的方法   ,,* */@OnOpen才能   public 才能;void  onOpen (Session 会话,@PathParam (“sid"), String  sid), {   ,,,this.session =,会话;   ,,,//加入组中   ,,,webSocketSet.add(这个);   ,,,//在线数加1   ,,,addOnlineCount ();   ,,,log.info(“有新窗口开始监听:“+ sid +“,当前在线人数为“,+,getOnlineCount ());   ,,,this.sid=sid;   ,,,try  {   ,,,,,sendMessage(“连接成功“);   ,,,},catch  (IOException  e), {   ,,,,,log.error (“websocket  IO异常“);   ,,,}   ,,}   ,/* *   ,,*,连接关闭调用的方法   ,,*/@OnClose才能   public 才能;void  onClose (), {   ,,,//从组中删除   ,,,webSocketSet.remove(这个);   ,,,//在线数减1   ,,,subOnlineCount ();   ,,,log.info(“有一连接关闭!当前在线人数为“,+,getOnlineCount ());   ,,}   ,/* *   ,,*,收到客户端消息后调用的方法   ,,*,@param  message 客户端发送过来的消息   ,,* */@OnMessage才能   public 才能;void  onMessage (String 消息,Session 会话),{   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在SpringBoot中使用WebSocket实现前后端消息互传