SpringBoot使用WebSocket實(shí)現(xiàn)前后端交互的操作方法
背景
我們都知道http協(xié)議只能在瀏覽器單方面向服務(wù)器發(fā)起請求時(shí)獲得響應(yīng),然而服務(wù)器不能主動(dòng)向?yàn)g覽器推送消息,想要實(shí)現(xiàn)瀏覽器的主動(dòng)推送目前有兩種主流的實(shí)現(xiàn)方式:
- 輪詢:缺點(diǎn)很多,但是實(shí)現(xiàn)簡單
- websocket: 在瀏覽器和服務(wù)器之間建立TCP連接,實(shí)現(xiàn)全雙工通信
- springboot使用websocket有兩種方式,一種是實(shí)現(xiàn)簡單的websocket,另外一種是實(shí)現(xiàn)STOMP協(xié)議。本篇講述如何使用springboot實(shí)現(xiàn)簡單的websocket。
實(shí)現(xiàn)
一、導(dǎo)入依賴
直接在pom.xml中導(dǎo)入依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
二、新建WebSocket配置類,注入Bean
首先注入一個(gè)ServerEndpointExporterBean,該Bean會(huì)自動(dòng)注冊使用@ServerEndpoint注解申請的websocket endpoint,代碼如下:
@Component
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}三、新建WebSocket服務(wù)端,在其中處理websocket邏輯
@Component //注冊到容器中
@ServerEndpoint("/webSocket") //接收websocket請求路徑
@Slf4j
public class WebSocket {
//當(dāng)前連接(每個(gè)websocket連入都會(huì)創(chuàng)建一個(gè)WebSocket實(shí)例)
private Session session;
//定義一個(gè)websocket容器存儲session,即存放所有在線的socket連接
private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>();
//處理連接建立
@OnOpen
public void opOpen(Session session){
this.session = session;
log.info("【有新的客戶端連接了】:{}",session.getId());
webSocketSet.add(this); //將新用戶加入在線組
log.info("【websocket消息】有新的連接,總數(shù):{}",webSocketSet.size());
}
//處理連接關(guān)閉
@OnClose
public void Onclose(){
webSocketSet.remove(this);
log.info("【websocket消息】連接斷開,總數(shù):{}",webSocketSet.size());
//接受消息
@OnMessage
public void onMessage(String message){
log.info("【websocket消息】收到客戶端發(fā)來的消息:{}",message);
// 群發(fā)消息
public void sendMessage(String message) {
for (WebSocket webSocket : webSocketSet) {
log.info("【websocket消息】廣播群發(fā)消息,message={}",message);
try {
webSocket.session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
四、客戶端實(shí)現(xiàn),可以借助FreeMarker模板工具直接寫在ftl文件里。
由于部分瀏覽器可能不支持,可以先測試,代碼如下:
<script>
var websocket = null;
if('WebSocket' in window){
websocket = new WebSocket('ws://localhost:8080/webSocket');
}else{
alert('當(dāng)前瀏覽器不支持websocket消息通知');
}
//連接成功建立的回調(diào)方法
websocket.onopen = function (event) {
console.log("ws建立連接成功");
//連接關(guān)閉的回調(diào)方法
websocket.onclose = function (event) {
console.log("ws連接關(guān)閉");
//接收到消息的回調(diào)方法
websocket.onmessage = function (event) {
/*setMessageInnerHTML(event.data);*/
// alert("ws接收返回消息:"+event.data);
console.log("服務(wù)器返回消息: " + event.data);
//彈窗提醒(要用到JQuary,所以要先引入JQuary) 播放音樂
$('#mymodal').modal('show')
//連接發(fā)生錯(cuò)誤的回調(diào)方法
websocket.onerror = function(event){
alert('websocket通信發(fā)生錯(cuò)誤!')
//監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。
window.onbeforeunload = function() {
websocket.close();
</script>
五、測試
(項(xiàng)目實(shí)現(xiàn)客戶創(chuàng)建新訂單之后,前臺發(fā)出提醒)
@Autowired
private WebSocket webSocket;
@Override
@Transactional
public OrderDTO create(OrderDTO orderDTO) {//創(chuàng)建訂單
。。。。(具體代碼省略)
//創(chuàng)建新訂單 發(fā)送websocket消息
webSocket.sendMessage(orderDTO.getOrderId());
return orderDTO;
}
添加新訂單:

接收到websocket消息


到此這篇關(guān)于SpringBoot使用WebSocket實(shí)現(xiàn)前后端交互的操作方法的文章就介紹到這了,更多相關(guān)SpringBoot前后端交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaWeb之Servlet注冊頁面的實(shí)現(xiàn)示例
注冊頁面是很多網(wǎng)站都會(huì)是使用的到,本文主要介紹了JavaWeb之Servlet注冊頁面的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Java版超大整數(shù)階乘算法代碼詳解-10,0000級
這篇文章主要介紹了Java版超大整數(shù)階乘算法代碼詳解-10,0000級,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
java webApp異步上傳圖片實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了java webApp異步上傳圖片實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Java開發(fā)環(huán)境配置JDK超詳細(xì)整理(適合新手入門)
這篇文章主要給大家介紹了關(guān)于Java開發(fā)環(huán)境配置JDK超詳細(xì)整理的相關(guān)資料,非常適合新手入門,JDK是Java語言的軟件開發(fā)工具包,主要用于移動(dòng)設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,需要的朋友可以參考下2023-11-11

