springboot+vue 使用websocket后臺(tái)主動(dòng)向前臺(tái)推送消息

前提

     本篇文章適用于入門(mén)級(jí)別岸售,不做深入研究贤斜。

后臺(tái)springboot代碼

引入依賴(lài)

        <!--websocket-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

配置類(lèi)

@Configuration
public class CommonConfig {

    /**
     * websocket配置
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

websocket服務(wù)類(lèi)

@ServerEndpoint("/websocket/{username}")
@Slf4j
@Component
public class Websocket {
    //靜態(tài)變量征讲,用來(lái)記錄當(dāng)前在線(xiàn)連接數(shù)。設(shè)計(jì)為安全的
    private static int onlineCount = 0;
    //concurrentHashMap分段鎖槐瑞,用來(lái)存放每個(gè)客戶(hù)端對(duì)應(yīng)的Websocket對(duì)象。
    private static Map<String, Websocket> clients = new ConcurrentHashMap<String, Websocket>();
    //與某個(gè)客戶(hù)端的連接會(huì)話(huà)鸳慈,需要通過(guò)它來(lái)給客戶(hù)端發(fā)送數(shù)據(jù)
    private Session session;
    private String username;

    /**
     * 連接建立成功調(diào)用的方法
     * @param username
     * @param session
     */
    @OnOpen
    public void onOpen(@PathParam("username") String username, Session session) {
        this.username = username;
        this.session = session;
        Websocket.onlineCount++;
        log.info("有一連接進(jìn)入拂募!當(dāng)前在線(xiàn)人數(shù)為" + onlineCount);
        clients.put(username, this);
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {
        clients.remove(username);
        Websocket.onlineCount--;
        log.info("有一連接關(guān)閉!當(dāng)前在線(xiàn)人數(shù)為" + onlineCount);

    }

    /**
     * 收到客戶(hù)端消息后調(diào)用的方法
     * @param message
     */
    @OnMessage
    public void onMessage(String message) {
        System.out.println("收到客戶(hù)端的消息"+message);
        sendMessage(message);
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        log.error("WebSocket發(fā)生錯(cuò)誤:" + throwable.getMessage());
    }

    public static void sendMessage(String message) {
        // 向所有連接websocket的客戶(hù)端發(fā)送消息
        // 可以修改為對(duì)某個(gè)客戶(hù)端發(fā)消息
        for (Websocket item : clients.values()) {
            item.session.getAsyncRemote().sendText(message);
        }
    }
}

測(cè)試請(qǐng)求方法

@RestController
@RequestMapping("/news")
public class NewsController {

    @GetMapping("/send")
    public String send(){
        Websocket.sendMessage("這是websocket群發(fā)消息帅刊!");
        return "發(fā)送消息成功";
    }

}

前端VUE

這是在創(chuàng)建vue項(xiàng)目自帶的HelloWorld.vue文件里修改的

<template>
  <div class="hello">
    <h1>測(cè)試webSocket</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },

  created() { // 頁(yè)面創(chuàng)建生命周期函數(shù)
    this.initWebSocket()
  },
  destroyed: function () { // 離開(kāi)頁(yè)面生命周期函數(shù)
    this.websocketclose();
  },
  methods: {
    initWebSocket: function () {
      // WebSocket與普通的請(qǐng)求所用協(xié)議有所不同纸泡,ws等同于http,wss等同于https
      this.websock = new WebSocket("ws://127.0.0.1:8031/websocket/test");
      this.websock.onopen = this.websocketonopen;
      this.websock.onerror = this.websocketonerror;
      this.websock.onmessage = this.websocketonmessage;
      this.websock.onclose = this.websocketclose;
    },
    websocketonopen: function () {
      console.log("WebSocket連接成功");
    },
    websocketonerror: function () {
      console.log("WebSocket連接發(fā)生錯(cuò)誤");
    },
    websocketonmessage: function (e) {
      console.log(e.data);                // console.log(e);
    },
    websocketclose: function (e) {
      console.log("connection closed (" + e.code + ")");
    }

  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

測(cè)試

OK赖瞒!代碼部分已結(jié)束女揭,現(xiàn)在先啟動(dòng)后臺(tái)springboot,和前端vue栏饮。打開(kāi)頁(yè)面按下F12看日志打印吧兔。


image.png

非常好,這時(shí)候說(shuō)明前后端websocket已經(jīng)連接成功了袍嬉。
下面用你的工具(http測(cè)試工具境蔼,postman之類(lèi)的)測(cè)試推送消息接口。

image.png

很棒伺通,調(diào)用接口成功箍土,信息成功發(fā)送。下面看看前端是否收到罐监。

image.png

OK吴藻!大功告成!各位朋友弓柱!
good luck调缨!
后會(huì)有期!

有什么問(wèn)題也可以私信我或評(píng)論吆你,看到就會(huì)回復(fù)弦叶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妇多,隨后出現(xiàn)的幾起案子伤哺,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立莉,死亡現(xiàn)場(chǎng)離奇詭異绢彤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蜓耻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)茫舶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人刹淌,你說(shuō)我怎么就攤上這事饶氏。” “怎么了有勾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵疹启,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蔼卡,道長(zhǎng)喊崖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任雇逞,我火速辦了婚禮荤懂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塘砸。我一直安慰自己节仿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布谣蠢。 她就那樣靜靜地躺著粟耻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眉踱。 梳的紋絲不亂的頭發(fā)上挤忙,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音谈喳,去河邊找鬼册烈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛婿禽,可吹牛的內(nèi)容都是我干的赏僧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扭倾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淀零!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起膛壹,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驾中,失蹤者是張志新(化名)和其女友劉穎唉堪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肩民,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唠亚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了持痰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶搜。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖工窍,靈堂內(nèi)的尸體忽然破棺而出割卖,到底是詐尸還是另有隱情,我是刑警寧澤移剪,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布究珊,位于F島的核電站薪者,受9級(jí)特大地震影響纵苛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜言津,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一攻人、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悬槽,春花似錦怀吻、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至磅叛,卻和暖如春屑咳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弊琴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工兆龙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敲董。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓紫皇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親腋寨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聪铺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350