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

springboot集成WebSockets廣播消息(推薦)

 更新時間:2019年12月30日 15:15:42   作者:知識追尋者  
這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

一 WebScoketS 簡介

RFC 6455 即 webSockets 協(xié)議提供了一種標準化的方式去建立全雙工,雙方面交流的通道在客戶端和服務(wù)端甚至單一的TCP連接中進行通信; webSockets 協(xié)議其跟HTTP的tcp協(xié)議不同,但是其設(shè)計目的是通過HTTP協(xié)議進行工作,可以使用40或者443端口和重新使用現(xiàn)有的防火墻規(guī)則;

GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080

webSockets 的交互是以HTTP協(xié)議開始的,使用Upgrade header 轉(zhuǎn)向使用Upgrade連接;如果非200狀態(tài)成功響應(yīng)就類似于下面的信息;如果WebSocket server 是運行在nginx是需要配置WebSocket upgrade requests ;如果是運行在云上,需要查閱相關(guān)的云是否支持WebSocket ;

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp

二 HTTP 和 WebSocket 對比

在HTTP和REST中一個應(yīng)用需要很多的URLs;應(yīng)用和客戶端是通過 請求和響應(yīng)的風(fēng)格使用這些URLs進行交互;服務(wù)端會路由這些請求給基于HTTP 的URL或者方法或者頭進行處理;

WebSockets 通常在初始化的時候就只有一個鏈接,所有應(yīng)用的消息都是通過相同的TCP連接進行流動;這指向一個完全不同的異步、事件驅(qū)動的消息傳遞體系結(jié)構(gòu)。

WebSocket 是一種低端的協(xié)議,不像HTTP,其不規(guī)定消息中內(nèi)容中任何的語義信息;這意味著其沒有任何方式去路由或者處理這些信息,除非客戶端和服務(wù)端在語義上達成一致;

WebSocket 客戶端和服務(wù)端其交流是通過使用更加高級的消息協(xié)議(比如STOMP)和基于HTTP握手請求的Sec-WebSocket-Protocol header ;

三 注意事項

WebSockets可以使web頁面具有動態(tài)性和交互性。然而,在許多情況下,Ajax和HTTP流或 long polling(輪詢)可以提供一個簡單有效的解決方案。HTTP流和polling適用于消息不頻繁的交互,WebSockets適用于消息較頻繁的交互;在 因特網(wǎng)上由于沒有Upgrade header 或者 關(guān)閉了空閑的長鏈接,受限于在你有限的代理可能會將WebSockets的交互排除;

四 websocket配置和依賴

4.1 依賴

 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.1.1.RELEASE</version>
 <relativePath/>
 </parent>
 
 <dependencies>
 <!-- websocket依賴-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-websocket</artifactId>
 </dependency>
 <!-- 模板引擎-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>
 </dependencies>

4.2 配置

/**
 * @Author lsc
 * @Description <p>websocket配置類 </p>
 * @Date 2019/11/12 22:27
 */
//使用STOMP協(xié)議來傳輸基于消息代理的消息,控制器支持在@Controller類中使用@MessageMapping
@EnableWebSocketMessageBroker
@Configurable
@EnableWebSocket
@Component
public class WebConfig implements WebSocketMessageBrokerConfigurer {

 @Override
 public void registerStompEndpoints(StompEndpointRegistry registry) {
 // 注冊 Stomp的端點(Endpoint),并且映射指定的url
 registry.addEndpoint("/websocket")
 .setAllowedOrigins("*") // 添加允許跨域訪問
 .withSockJS();// 指定SockJS協(xié)議
 }

 @Override
 public void configureMessageBroker(MessageBrokerRegistry registry) {
 // 啟動廣播模式代理,只有符合的的路徑才發(fā)送消息
 registry.enableSimpleBroker("/topic");
 }
}

五 實體類

5.1 接受消息實體

/**
 * @Author lsc
 * @Description <p> 接受客戶端消息</p>
 * @Date 2019/11/12 22:42
 */
public class AcceptMessages {

 private String name;

 public String getName() {
 return name;
 }
}

5.2 發(fā)送消息實體

/**
 * @Author lsc
 * @Description <p>發(fā)送消息給客戶端 </p>
 * @Date 2019/11/12 22:42
 */
public class SendMessages {

 private String responseMessage;

 public String getResponseMessage() {
 return responseMessage;
 }

 public void setResponseMessage(String responseMessage) {
 this.responseMessage = responseMessage;
 }
}

六控制器

/**
 * @Author lsc
 * @Description <p>websockets 之 廣播式</p>
 * @Date 2019/11/12 22:49
 */
@Controller
public class WebSocketsController {

 @MessageMapping("/welcome")//類似@RequestMapping,進行客戶端請求地址映射
 @SendTo("/topic/getResponse")//訂閱了@SendTo中的路徑進行發(fā)送消息
 public SendMessages broadcast(AcceptMessages acceptMessages){
 System.out.println(acceptMessages.getName());
 SendMessages sendMessages = new SendMessages();
 sendMessages.setResponseMessage("知識追尋者:"+acceptMessages.getName());
 return sendMessages;
 }

}

七 前端頁面

在 resource目錄下新建templates目錄存放WebSockets.html;在resource目錄下新建static目錄,繼續(xù)在其子目錄下新建js目錄存放sockjs.min.js,stomp.min.js,jquery-3.3.1.min.js;

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
 <meta charset="UTF-8"/>
 <title>springboot廣播式WebSocket</title>
</head>
<body onload="disconnect()">
<noscript><h2 style="color: #ffff0000;">Sorry,not support the WebSocket</h2></noscript>
<div>
 <div>
 <button id="connect" onclick="connect();">連接</button>
 <button id="disconnect" disabled="disabled" onclick="disconnect();">斷開連接</button>
 </div>
 <div id="conversationDiv">
 <label>輸入你的名字</label>
 <input type="text" id="name"/>
 <button id="sendName" onclick="sendName();">發(fā)送</button>
 <p id="response"></p>
 </div>
</div>
<script th:src="@{js/sockjs.min.js}"></script>
<script th:src="@{js/stomp.min.js}"></script>
<script th:src="@{js/jquery-3.3.1.min.js}"></script>
<script type="text/javascript">
 var stompClient = null;
 // 設(shè)置連接
 function setConnected(connected) {
 document.getElementById("connect").disabled = connected;
 document.getElementById("disconnect").disabled = !connected;
 document.getElementById("conversationDiv").style.visibility = connected ? 'visible' : 'hidden';
 $("#response").html();
 }
 // 連接
 function connect() {
 // 轉(zhuǎn)向 endpoint 名為websocket
 var socket = new SockJS('/websocket');
 // 使用ssocket的協(xié)議
 stompClient = Stomp.over(socket);
 // 連接
 stompClient.connect({}, function (frame) {
 setConnected(true);
 console.log('Connected:' + frame);
 // @Sendto 中定義路徑 向目標訂閱消息
 stompClient.subscribe('/topic/getResponse', function (response) {
 showResponse(JSON.parse(response.body).responseMessage);
 })
 });
 }
 function disconnect() {
 if (stompClient != null) {
 stompClient.disconnect();
 }
 setConnected(false);
 console.log('Disconnected');
 }
 function sendName() {
 var name = $('#name').val();
 // 控制器@MessageMapping中定義向目標發(fā)送消息
 stompClient.send("/welcome", {}, JSON.stringify({'name': name}));
 }
 function showResponse(message) {
 $("#response").html(message);
 }
</script>
</body>
</html>

八 視圖轉(zhuǎn)發(fā)

當客戶端請求地址是localhost:8080/ws,經(jīng)過springmvc視圖轉(zhuǎn)發(fā)器至WebSockets.html;

/**
 * @Author lsc
 * @Description <p> spingmvc視圖映射轉(zhuǎn)發(fā)</p>
 * @Date 2019/11/12 23:35
 */
@Configurable
@Component
public class WebMvcConfig implements WebMvcConfigurer {

 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
 // 配置視圖轉(zhuǎn)發(fā)
 registry.addViewController("/ws").setViewName("/WebSockets");
 }
}

九 效果圖

即一個瀏覽器發(fā)送消息,其它連接的瀏覽器也能收到消息,即廣播形式;

十 參考文獻

spring-web

源碼

總結(jié)

以上所述是小編給大家介紹的springboot集成WebSockets廣播消息,希望對大家有所幫助!

相關(guān)文章

  • 純Java代碼實現(xiàn)流星劃過天空

    純Java代碼實現(xiàn)流星劃過天空

    本文給大家介紹純java代碼實現(xiàn)流星劃過天空,包括流星個數(shù),流星飛行的速度,色階,流星大小相關(guān)變量設(shè)置。對java流星劃過天空特效代碼感興趣的朋友可以參考下本文
    2015-10-10
  • Spring?Boot使用Schedule實現(xiàn)定時任務(wù)的方法

    Spring?Boot使用Schedule實現(xiàn)定時任務(wù)的方法

    這篇文章主要介紹了Spring?Boot使用Schedule實現(xiàn)定時任務(wù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 詳解Alibaba?Java診斷工具Arthas查看Dubbo動態(tài)代理類

    詳解Alibaba?Java診斷工具Arthas查看Dubbo動態(tài)代理類

    這篇文章主要介紹了Alibaba?Java診斷工具Arthas查看Dubbo動態(tài)代理類?,它可以幫助我們查看JDK或者javassist生成的動態(tài)代理類,當然,它的功能遠不止此,還可以在生產(chǎn)環(huán)境進行診斷,需要的朋友可以參考下
    2022-04-04
  • Spring?@EventListener?異步中使用condition的問題及處理

    Spring?@EventListener?異步中使用condition的問題及處理

    這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問題及處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot 集成支付寶支付的示例代碼

    springboot 集成支付寶支付的示例代碼

    這篇文章主要介紹了springboot 集成支付寶支付的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java程序員面試中的多線程問題總結(jié)

    Java程序員面試中的多線程問題總結(jié)

    這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級工程師所問到。這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級工程師所問到。
    2016-11-11
  • JAVA正則表達式及字符串的替換與分解相關(guān)知識總結(jié)

    JAVA正則表達式及字符串的替換與分解相關(guān)知識總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識總結(jié),文章圍繞著JAVA正則表達式及字符串的替換與分解展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 升級springboot中spring框架的版本的實現(xiàn)方法

    升級springboot中spring框架的版本的實現(xiàn)方法

    本文主要介紹了升級springboot中spring框架的版本的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Springboot集成Tika實現(xiàn)文檔解析

    Springboot集成Tika實現(xiàn)文檔解析

    Tika是一款A(yù)pache開源的,跨平臺,支持多品種文本類型的內(nèi)容檢測和提取工具,本文將介紹Springboot如何集成Tika實現(xiàn)文檔解析,需要的可以參考下
    2024-11-11
  • Java中正則表達式去除html標簽

    Java中正則表達式去除html標簽

    Java中正則表達式去除html的標簽,主要目的更精確的顯示內(nèi)容,接下來通過本文給大家介紹Java中正則表達式去除html標簽的方法,需要的朋友參考下
    2017-02-02

最新評論

林西县| 靖安县| 江永县| 泰州市| 八宿县| 宿州市| 遂川县| 郸城县| 抚顺市| 泉州市| 伊宁市| 安西县| 万盛区| 华容县| 明溪县| 抚顺市| 大方县| 衡山县| 吴桥县| 平乐县| 万载县| 乃东县| 二连浩特市| 封丘县| 铁力市| 江川县| 宿州市| 哈巴河县| 丰原市| 卢氏县| 乌兰县| 团风县| 抚松县| 兴业县| 六盘水市| 衡阳市| 永昌县| 顺昌县| 砚山县| 额济纳旗| 临颍县|