<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          [文末贈(zèng)書]手把手教你SpringBoot整合websocket實(shí)現(xiàn)消息推送

          共 4173字,需瀏覽 9分鐘

           ·

          2021-01-30 11:55

          點(diǎn)擊上方 Java學(xué)習(xí)之道,選擇 設(shè)為星標(biāo)

          每天12點(diǎn),干貨準(zhǔn)時(shí)奉上!

          來源: segmentfault.com/a/1190000011908831
          作者: kunm

          依賴

          • springboot基礎(chǔ)環(huán)境,請參考springboot文檔
          • maven依賴

          ????????????org.springframework.boot
          ????????????spring-boot-starter-websocket
          ????????

          環(huán)境準(zhǔn)備

          準(zhǔn)備常量類

          //webSocket相關(guān)配置
          ????//鏈接地址
          ????public?static?String?WEBSOCKETPATHPERFIX?=?"/ws-push";
          ????public?static?String?WEBSOCKETPATH?=?"/endpointWisely";
          ????//消息代理路徑
          ????public?static?String?WEBSOCKETBROADCASTPATH?=?"/topic";
          ????//前端發(fā)送給服務(wù)端請求地址
          ????public?static?final?String?FORETOSERVERPATH?=?"/welcome";
          ????//服務(wù)端生產(chǎn)地址,客戶端訂閱此地址以接收服務(wù)端生產(chǎn)的消息
          ????public?static?final?String?PRODUCERPATH?=?"/topic/getResponse";
          ????//點(diǎn)對點(diǎn)消息推送地址前綴
          ????public?static?final?String?P2PPUSHBASEPATH?=?"/user";
          ????//點(diǎn)對點(diǎn)消息推送地址后綴,最后的地址為/user/用戶識(shí)別碼/msg
          ????public?static?final?String?P2PPUSHPATH?=?"/msg";

          接收前端消息實(shí)體

          public?class?WiselyMessage?{
          ????private?String?name;

          ????public?String?getName()?{
          ????????return?name;
          ????}

          ????public?void?setName(String?name)?{
          ????????this.name?=?name;
          ????}
          }

          后臺(tái)發(fā)送消息實(shí)體

          private?String?responseMessage;

          ????public?WiselyResponse(String?responseMessage){
          ????????this.responseMessage?=?responseMessage;
          ????}

          ????public?String?getResponseMessage()?{
          ????????return?responseMessage;
          ????}

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

          配置websocket

          @Configuration
          //?@EnableWebSocketMessageBroker注解用于開啟使用STOMP協(xié)議來傳輸基于代理(MessageBroker)的消息,這時(shí)候控制器(controller)
          //?開始支持@MessageMapping,就像是使用@requestMapping一樣。
          @EnableWebSocketMessageBroker
          public?class?WebSocketConfig?extends?AbstractWebSocketMessageBrokerConfigurer?{

          ????@Override
          ????public?void?registerStompEndpoints(StompEndpointRegistry?stompEndpointRegistry)?{
          ????????//注冊一個(gè)Stomp的節(jié)點(diǎn)(endpoint),并指定使用SockJS協(xié)議。
          ????????stompEndpointRegistry.addEndpoint(Constant.WEBSOCKETPATH).withSockJS();
          ????}

          ????@Override
          ????public?void?configureMessageBroker(MessageBrokerRegistry?registry)?{
          ????????//服務(wù)端發(fā)送消息給客戶端的域,多個(gè)用逗號(hào)隔開
          ????????registry.enableSimpleBroker(Constant.WEBSOCKETBROADCASTPATH,?Constant.P2PPUSHBASEPATH);
          ????????//定義一對一推送的時(shí)候前綴
          ????????registry.setUserDestinationPrefix(Constant.P2PPUSHBASEPATH);
          ????????//定義websoket前綴
          ????????registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);
          ????}
          }

          service

          @Service
          public?class?WebSocketService?{

          ????@Autowired
          ????private?SimpMessagingTemplate?template;

          ????/**
          ?????*?廣播
          ?????*?發(fā)給所有在線用戶
          ?????*
          ?????*?@param?msg
          ?????*/
          ????public?void?sendMsg(WiselyResponse?msg)?{
          ????????template.convertAndSend(Constant.PRODUCERPATH,?msg);
          ????}

          ????/**
          ?????*?發(fā)送給指定用戶
          ?????*?@param?users
          ?????*?@param?msg
          ?????*/
          ????public?void?send2Users(List?users,?WiselyResponse?msg)?{
          ????????users.forEach(userName?->?{
          ????????????template.convertAndSendToUser(userName,?Constant.P2PPUSHPATH,?msg);
          ????????});
          ????}
          }

          控制器

          @Controller
          public?class?WsController?{

          ????@Resource
          ????WebSocketService?webSocketService;

          ????@MessageMapping(Constant.FORETOSERVERPATH)//@MessageMapping和@RequestMapping功能類似,用于設(shè)置URL映射地址,瀏覽器向服務(wù)器發(fā)起請求,需要通過該地址。
          ????@SendTo(Constant.PRODUCERPATH)//如果服務(wù)器接受到了消息,就會(huì)對訂閱了@SendTo括號(hào)中的地址傳送消息。
          ????public?WiselyResponse?say(WiselyMessage?message)?throws?Exception?{
          ????????List?users?=?Lists.newArrayList();
          ????????users.add("d892bf12bf7d11e793b69c5c8e6f60fb");//此處寫死只是為了方便測試,此值需要對應(yīng)頁面中訂閱個(gè)人消息的userId
          ????????webSocketService.send2Users(users,?new?WiselyResponse("admin?hello"));

          ????????return?new?WiselyResponse("Welcome,?"?+?message.getName()?+?"!");
          ????}
          }

          頁面


          "http://www.thymeleaf.org">

          ????"UTF-8"?/>
          ????Spring?Boot+WebSocket+廣播式


          "disconnect()">


          ????

          ????????"connect"?onclick="connect();">連接
          ????????"disconnect"?disabled="disabled"?onclick="disconnect();">斷開連接
          ????

          ????"conversationDiv">
          ????????type="text"?id="name"?/>
          ????????"sendName"?onclick="sendName();">發(fā)送
          ????????"response">


          ????????"response1">


          ????









          測試

          點(diǎn)擊連接控制臺(tái)輸出

          表示連接成功并且訂閱了兩個(gè)地址

          ?

          此時(shí)在文本框內(nèi)輸入任意值 結(jié)果如圖所示則代表成功

          ?
          ?

          控制臺(tái)中顯示依次為,發(fā)送信息,目標(biāo)長度內(nèi)容

          ?
          此時(shí)服務(wù)端控制器接收到請求
          ?

          同時(shí)給指定用戶發(fā)送了消息,所以控制臺(tái)接收到消息

          ?
          ?

          同時(shí)因?yàn)榭刂破饔凶⒔釦SendTo所以會(huì)向@SendTo的地址廣播消息,客戶端訂閱了廣播地址所有控制臺(tái)顯示接收了消息

          ?
          送書活動(dòng)
          首先,感謝北京大學(xué)出版社為 "Java學(xué)習(xí)之道" 提供的書籍贊助,非常感謝!后續(xù)公眾號(hào)頭條推文,1周至少會(huì)有1-2次的文末送書活動(dòng),大家記得看完文章后,多多參與送書哈,混臉熟也能中獎(jiǎng)

          《程序員數(shù)學(xué)從零開始》

          從人們身邊常見的整數(shù)講起,逐步深入,介紹了數(shù)論、計(jì)數(shù)、圖論、機(jī)器學(xué)習(xí)等領(lǐng)域的一些典型算法及其原理,尤其是算法背后的數(shù)學(xué)原理,可以讓讀者輕松對算法建立更深入的理解。


          可點(diǎn)擊下方鏈接直接購買
          • 「一等獎(jiǎng)」:1名 --《程序員數(shù)學(xué)從零開始》書籍一本
          • 「二等獎(jiǎng)」:2 名 -- 現(xiàn)金紅包 9.99 元
          • 「三等獎(jiǎng)」:3 名 -- 現(xiàn)金紅包 6.66 元
          • 「幸運(yùn)獎(jiǎng)」:10名 -- 現(xiàn)金紅包 1 元

          ???免費(fèi)獲取方法:

          2月4日前公眾號(hào)后臺(tái)回復(fù)?【?java學(xué)習(xí)?即可參與活動(dòng)!!!

          掃碼回復(fù)「java學(xué)習(xí)」抽獎(jiǎng)品

          沒加小編微信的建議先加一下小編微信,方便中獎(jiǎng)之后安排發(fā)貨和領(lǐng)

          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日夜夜免费看三级片 | 日日操B| 欧美日韩中文字幕无码 | ww99色| 亚洲色情A片 |