最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 中的 SockJS原理及使用方法

 更新時間:2023年07月04日 14:44:00   作者:it_xushixiong  
SockJS 的主要作用是提供一種 WebSocket 的兼容性解決方案,使得不支持 WebSocket 的瀏覽器也可以使用 WebSocket,本文介紹了Spring Boot中的SockJS,包括SockJS的原理,使用方法和示例代碼,感興趣的朋友跟隨小編一起看看吧

Spring Boot 中的 SockJS

在 Spring Boot 中,SockJS 是一個用于實現(xiàn) WebSocket 的兼容性解決方案。本文將介紹 SockJS 的原理、使用方法和示例代碼。

什么是 SockJS

SockJS 是一種瀏覽器與服務(wù)器之間的通信協(xié)議,它可以在瀏覽器和服務(wù)器之間建立一個基于 HTTP 的雙向通信通道。SockJS 的主要作用是提供一種 WebSocket 的兼容性解決方案,使得不支持 WebSocket 的瀏覽器也可以使用 WebSocket。

SockJS 實現(xiàn)了一個 WebSocket 的兼容層,它可以在瀏覽器和服務(wù)器之間建立一個基于 HTTP 的通信通道,然后通過這個通道進(jìn)行雙向通信。當(dāng)瀏覽器不支持 WebSocket 時,SockJS 會自動切換到使用輪詢(polling)或長輪詢(long-polling)的方式進(jìn)行通信。

SockJS 的原理

SockJS 的原理是通過建立一個基于 HTTP 的通信通道來實現(xiàn) WebSocket 的雙向通信。當(dāng)瀏覽器支持 WebSocket 時,SockJS 會直接使用 WebSocket 進(jìn)行通信;當(dāng)瀏覽器不支持 WebSocket 時,SockJS 會自動切換到使用輪詢(polling)或長輪詢(long-polling)的方式進(jìn)行通信。

在使用 SockJS 時,首先需要在客戶端和服務(wù)器端分別引入 sockjs-client.jssockjs-server,然后在客戶端通過 new SockJS(url) 的方式建立一個 SockJS 連接。

客戶端和服務(wù)器端之間的通信是基于事件的,當(dāng)客戶端發(fā)送消息時,服務(wù)器端會觸發(fā)一個 onmessage 事件,然后將消息發(fā)送回客戶端??蛻舳嗽诮邮盏较⒑?,會觸發(fā)一個 onmessage 事件,然后處理收到的消息。

如何使用 SockJS

使用 SockJS 非常簡單,在 Spring Boot 中,只需要在配置文件中添加以下內(nèi)容即可:

spring:
  websocket:
    enabled: true
    broker:
      relay-host: localhost
      relay-port: 61613
      user: guest
      password: guest
      relay-path: /stomp

以上配置表示啟用 WebSocket,并將消息發(fā)送到 localhost61613 端口,使用 guest/guest 的用戶名和密碼進(jìn)行認(rèn)證,使用 /stomp 路徑進(jìn)行消息傳輸。

接下來,我們需要在客戶端中建立一個 SockJS 連接,并實現(xiàn) onmessage 事件的回調(diào)方法。代碼如下:

var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
    stompClient.subscribe('/topic/greetings', function(greeting){
        showGreeting(JSON.parse(greeting.body).content);
    });
});

以上代碼中,new SockJS('/gs-guide-websocket') 表示使用 /gs-guide-websocket 路徑建立一個 SockJS 連接。stompClient.connect({}, function(frame){...}) 表示連接成功后執(zhí)行的回調(diào)方法,stompClient.subscribe('/topic/greetings', function(greeting){...}) 表示訂閱 /topic/greetings 目的地,當(dāng)有消息發(fā)布到該目的地時觸發(fā)回調(diào)方法。

最后,我們需要在服務(wù)器端實現(xiàn)消息發(fā)送和接收的功能。代碼如下:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay("/topic")
            .setRelayHost("localhost")
            .setRelayPort(61613)
            .setClientLogin("guest")
            .setClientPasscode("guest")
            .setSystemHeartbeatSendInterval(5000)
            .setSystemHeartbeatReceiveInterval(4000);
        registry.setApplicationDestinationPrefixes("/app");
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }
}

以上代碼中,@EnableWebSocketMessageBroker 注解表示啟用 WebSocket 消息代理,configureMessageBroker 方法用于配置消息代理,registerStompEndpoints 方法用于注冊 SockJS 端點。

接下來,我們需要在控制器中實現(xiàn)消息發(fā)送和接收的功能。代碼如下:

@Controller
public class GreetingController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }
}

以上代碼中,@MessageMapping("/hello") 注解表示處理 /hello 目的地的消息,@SendTo("/topic/greetings") 注解表示將處理結(jié)果發(fā)送到 /topic/greetings 目的地。greeting 方法實現(xiàn)了消息的處理邏輯。

示例代碼

以下是一個完整的示例代碼,包括客戶端和服務(wù)器端的代碼:

客戶端代碼

<!DOCTYPE html>
<html>
<head>
    <title>Hello WebSocket</title>
    <script src="/webjars/sockjs-client/1.1.2/dist/sockjs.min.js"></script>
    <script src="/webjars/stomp-websocket/2.3.3/dist/stomp.min.js"></script>
    <script src="/js/app.js"></script>
</head>
<body>
    <div>
        <label>What is your name?</label>
        <input type="text" id="name" />
        <button type="button" onclick="send()">Send</button>
    </div>
    <div id="greetings">
    </div>
</body>
</html>
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
    stompClient.subscribe('/topic/greetings', function(greeting){
        showGreeting(JSON.parse(greeting.body).content);
    });
});
function send() {
    var name = document.getElementById('name').value;
    stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}
function showGreeting(message) {
    var div = document.createElement('div');
    div.appendChild(document.createTextNode(message));
    document.getElementById('greetings').appendChild(div);
}

服務(wù)器端代碼

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay("/topic")
            .setRelayHost("localhost")
            .setRelayPort(61613)
            .setClientLogin("guest")
            .setClientPasscode("guest")
            .setSystemHeartbeatSendInterval(5000)
            .setSystemHeartbeatReceiveInterval(4000);
        registry.setApplicationDestinationPrefixes("/app");
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }
}
@Controller
public class GreetingController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }
}
public class HelloMessage {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class Greeting {
    private String content;
    public Greeting(String content) {
        this.content = content;
    }
    public String getContent() {
        return content;
    }
}

以上代碼實現(xiàn)了一個簡單的聊天室,用戶在輸入框中輸入自己的名字,然后點擊發(fā)送按鈕,將消息發(fā)送到服務(wù)器端,服務(wù)器端將收到的消息處理后發(fā)送回客戶端,客戶端顯示收到的消息。當(dāng)多個用戶同時使用該聊天室時,每個用戶都可以看到其他用戶發(fā)送的消息。

總結(jié)

本文介紹了 Spring Boot 中的 SockJS,包括 SockJS 的原理、使用方法和示例代碼

到此這篇關(guān)于Spring Boot 中的 SockJS的文章就介紹到這了,更多相關(guān)Spring Boot SockJS內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java抽象定義以及舉例代碼

    Java抽象定義以及舉例代碼

    這篇文章主要給大家介紹了關(guān)于Java抽象定義以及舉例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Spring Boot 在啟動時進(jìn)行配置文件加解密的方法詳解

    Spring Boot 在啟動時進(jìn)行配置文件加解密的方法詳解

    這篇文章主要介紹了Spring Boot 在啟動時進(jìn)行配置文件加解密的方法,本文通過實例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 淺析SpringBoot自動化配置原理實現(xiàn)

    淺析SpringBoot自動化配置原理實現(xiàn)

    這篇文章主要介紹了淺析SpringBoot自動化配置原理實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot通過自定義注解與異步來管理日志流程

    SpringBoot通過自定義注解與異步來管理日志流程

    實現(xiàn)日志管理說實話方式還挺多,個人使用過直接在Controller代碼里面寫、AOP+自定義注解、ConstraintValidator。本文主要和大家講的是自定義注解與異步來管理日志流程,感興趣的可以了解一下
    2023-03-03
  • SpringBoot開發(fā)技巧啟動時配置校驗實現(xiàn)示例

    SpringBoot開發(fā)技巧啟動時配置校驗實現(xiàn)示例

    這篇文章主要為大家介紹了SpringBoot開發(fā)在啟動時自動配置校驗的實現(xiàn)示例及原理解析,有需要的朋友可以借鑒參考下希望能夠有所幫助
    2021-10-10
  • 詳解Java的線程狀態(tài)

    詳解Java的線程狀態(tài)

    本文主要為大家詳細(xì)介紹一下Java的線程狀態(tài),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定的幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-11-11
  • MyBatis?和?MyBatis-Plus從語法詳解和優(yōu)劣對比

    MyBatis?和?MyBatis-Plus從語法詳解和優(yōu)劣對比

    MyBatis和MyBatis-Plus是Java生態(tài)中常用的持久層框架,其中?MyBatis-Plus是在?MyBatis?基礎(chǔ)上的增強(qiáng)工具,下面從語法詳解和優(yōu)劣對比兩部分展開說明,感興趣的朋友一起看看吧
    2025-07-07
  • Java算法之計數(shù)排序、桶排序、基數(shù)排序?qū)崿F(xiàn)代碼

    Java算法之計數(shù)排序、桶排序、基數(shù)排序?qū)崿F(xiàn)代碼

    這篇文章主要介紹了Java算法之計數(shù)排序、桶排序、基數(shù)排序?qū)崿F(xiàn)的相關(guān)資料,分別通過計數(shù)、分桶和位數(shù)處理實現(xiàn)高效穩(wěn)定排序,文中通過代碼及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-05-05
  • Java參數(shù)傳遞及值傳遞實現(xiàn)原理詳解

    Java參數(shù)傳遞及值傳遞實現(xiàn)原理詳解

    這篇文章主要介紹了Java參數(shù)傳遞及值傳遞實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • java.sql.SQLException問題解決以及注意事項

    java.sql.SQLException問題解決以及注意事項

    這篇文章主要給大家介紹了關(guān)于java.sql.SQLException問題解決以及注意事項的相關(guān)資料,這個問題其實很好解決,文中通過圖文將解決的辦法介紹的很詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評論

隆回县| 普兰县| 宁河县| 涪陵区| 大竹县| 突泉县| 金沙县| 牙克石市| 武鸣县| 巴东县| 迭部县| 肥东县| 茌平县| 永丰县| 资源县| 哈密市| 宾阳县| 商都县| 广州市| 乐昌市| 星座| 开平市| 建阳市| 天镇县| 修水县| 仙游县| 蕉岭县| 蒙自县| 平安县| 宁都县| 调兵山市| 古丈县| 无为县| 呼伦贝尔市| 洱源县| 绵竹市| 武穴市| 油尖旺区| 巴林右旗| 乐陵市| 凌源市|