springBoot整合WebSocket實例

1、引入WebSocket依賴

<!--引入webSocket技術-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2、創建配置類將ServerEndpointExporter進行Bean的注入

package com.ltj.demo.Configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;


/**
 * 注入ServerEndpointExporter,這個bean會自動註冊使用@ServerEndpoint註解聲明的Websocket類服務器。
 * 要注意,如果使用獨立的servlet容器,而不是直接使用springboot的內置容器,就不要注入ServerEndpointExporter, 因爲它將由容器自己提供和管理。
 */
@Component
public class webSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }

}

3、創建WebSocket服務器配置類

package com.ltj.demo.Controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;


/**
 *  註冊該類爲一個WebSocket服務器
 *  @ServerEndpoint將該類設置爲WebSocket訪問的服務器,參數值爲訪問該服務器的URL地址
 */
@Component
@Slf4j
@ServerEndpoint("/WebSocket")
public class WebSocket {

    //創建Session存儲數據
    private Session session;

    /**
     * 創建CopyOnWriteArraySet集合存儲WebSocket訪問信息
     *  ,並將該集合設置爲Static伴隨該類同時創建,並存儲Session
     */
    private static CopyOnWriteArraySet<WebSocket> webSocketsSet = new CopyOnWriteArraySet<>();

    /**
     * 連接建立時觸發
     * @param session
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        webSocketsSet.add(this);
        log.info("當前在線訪問人數:{}",webSocketsSet.size());
    }

    /**
     * 連接關閉時觸發
     */
    @OnClose
    public void onClose(){
        webSocketsSet.remove(this);
        log.info("當前在線訪問人數:{}",webSocketsSet.size());
    }

    /**
     * 服務端接收到客戶端數據時觸發
     * @param message
     */
    @OnMessage
    public void onMessage(String message){
        log.info("收到客戶端發來的信息:" + message);
    }

    /**
     * 對webSocketsSet以文本的形式循環進行發送
     * @param message   推送到用戶客戶端的信息
     */
    public void sendMessage(String message){
        for (WebSocket webSocket:webSocketsSet) {
            log.info("廣播消息:" + message);
            try {
                //對webSocketsSet集合中的socket信息進行循環輸出
                webSocket.session.getBasicRemote().sendText(message);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

}

4、創建業務類,作爲觸發WebSocket服務器的一個測試類

package com.ltj.demo.Controller;

import com.ltj.demo.Dao.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.websocket.server.PathParam;

/**
 * 測試類
 */
@Controller
@Slf4j
@RequestMapping("/testWebSocket")
public class testWebSocket {

    @Autowired
    WebSocket webSocket;

    @ResponseBody
    @RequestMapping("/webSocket")
    public User testWebSocket(@PathParam("name") String name,
                              @PathParam("age") Integer age){

        User user = new User();

        //訪問WebSocket並向客戶端發送信息
        webSocket.sendMessage("前端已經接收到數據了,姓名爲:" + name + ",年齡爲:" + age);

        log.info("姓名:{},年齡:{}",name,age);

        user.setAge(age);
        user.setUserName(name);

        return user;
    }

}

5、創建User類

package com.ltj.demo.Dao;

import lombok.Data;

@Data
public class User {

    public String userName;
    public Integer age;


}

6、創建測試跳轉頁面

package com.ltj.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 跳轉到測試WebSocket頁面
 */
@Controller
@RequestMapping("/webSocket/openOneSocket")
public class ToWebSocketIndex {

    @RequestMapping("/toSocketPage")
    public String toSocketPage(){
        //跳轉到testWebSocket.html頁面中
        return "testWebSocket";
    }

}

7、前端html頁面編寫

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<script>
        var socket = null;

        //判斷當前瀏覽器是否支持WebSocket技術,現如今大多數瀏覽器都支持
        if("WebSocket" in window){
            alert("您的瀏覽器支持WebSocket技術");
            //地址使用webSocket協議
             socket = new WebSocket("ws://localhost:8080/WebSocket");
        }else{
            alert("您的瀏覽器不支持WebSocket技術");
        }

        //建立連接的時候將會觸發
        socket.onopen = function () {
            console.log("建立連接");
        }

        //服務器發送返回數據到客戶端的時候觸
        socket.onmessage = function (evt) {
            var received_msg = evt.data;
            console.log("收到信息:" + received_msg);
        }

        //socket出錯的時候觸發
        socket.onerror = function () {
            console.log("網頁發送異常!");
        }

        //斷開連接的視乎觸發
        socket.onclose = function () {
            console.log("斷開連接");
        }

        //關閉socket
        socket.onbeforeunload = function () {
            socket.close();
        }

</script>
<body>
    測試WebSocket
</body>
</html>

 

 

 

1)項目啓動

2)postMan測試路徑:localhost:8080/testWebSocket/webSocket

3)網頁測試路徑:http://localhost:8080/webSocket/openOneSocket/toSocketPage

4)訪問頁面地址,建立WebSocket連接,瀏覽器控制檯顯示“建立連接”成功,IDEA控制檯顯示打印日誌,正常顯示當前當前通信訪問人數

5)postMan發送請求到後端測試類中,觸發WebSocket服務器,,輸入key=luo,age=123,前端頁面接收信息

6)關閉項目,WebSocket異常通信並且斷開連接

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章