springBoot socket

做個SpringBoot Socket使用的簡單記錄

功能:后臺實時向前臺發(fā)送提醒信息

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.2.3</version>
            <classifier>jdk15</classifier><!-- jdk版本 -->
        </dependency>

    </dependencies>
@Component
@ServerEndpoint("/msg/{userID}")
public class MsgSocket {

    private static final Logger logger = LoggerFactory.getLogger(MsgSocket.class);
    private static Map<String, Session> clients = new ConcurrentHashMap<>();

    @OnOpen
    public void open(@PathParam("userID")String userID,Session session) {
        clients.put(userID, session);
        logger.info("userID:{},session:{}",userID,session.getAsyncRemote());
    }

    @OnMessage
    public void onMessage(String message) throws IOException {
        JSONObject jsonTo = JSONObject.fromObject(message);
        String msg = (String) jsonTo.get("message");
        String userID = (String) jsonTo.get("userID");

        sendMessageTo(msg,userID);

    }

    private void sendMessageTo(String message, String userID) throws IOException {
        Session session = clients.get(userID);

        if (session == null) {
            return;
        }

        session.getAsyncRemote().sendText(message);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
@RestController
public class TestController {

    @GetMapping("/test")
    public String test() throws IOException {

        MsgSocket msgSocket = new MsgSocket();
        JSONObject jo = new JSONObject();
        jo.put("message", "這是后臺返回的消息浙宜!");
        jo.put("userID","huang");
        msgSocket.onMessage(jo.toString());

        return "success";
    }
}

用一個簡單頁面做測試

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script>
    var websocket = null;

    var host = document.location.host;

    var username = "huang"; // 獲得當前登錄人員的userName

    // alert(username)

    //判斷當前瀏覽器是否支持WebSocket

    if ('WebSocket' in window) {

        alert("瀏覽器支持Websocket"+host)

        websocket = new WebSocket('ws://' + 'localhost:8080' + '/msg/' + username);
        alert('ws://' + 'localhost:8080' + '/msg/' + username)

    } else {

        alert('當前瀏覽器 Not support websocket')

    }


    //連接發(fā)生錯誤的回調(diào)方法

    websocket.onerror = function (e) {

        alert(e)

        alert("WebSocket連接發(fā)生錯誤")

        setMessageInnerHTML("WebSocket連接發(fā)生錯誤");

    };


    //連接成功建立的回調(diào)方法

    websocket.onopen = function () {

        alert("WebSocket連接成功")

        setMessageInnerHTML("WebSocket連接成功");

    }


    //接收到消息的回調(diào)方法

    websocket.onmessage = function (event) {

        alert("接收到消息的回調(diào)方法")

        alert("這是后臺推送的消息:" + event.data);

        websocket.close();

        alert("webSocket已關(guān)閉溉仑!")

    }


    //連接關(guān)閉的回調(diào)方法

    websocket.onclose = function () {

        setMessageInnerHTML("WebSocket連接關(guān)閉");

    }


    //監(jiān)聽窗口關(guān)閉事件,當窗口關(guān)閉時益楼,主動去關(guān)閉websocket連接沸毁,防止連接還沒斷開就關(guān)閉窗口训貌,server端會拋異常。

    window.onbeforeunload = function () {

        closeWebSocket();

    }


    //關(guān)閉WebSocket連接

    function closeWebSocket() {

        websocket.close();

    }


    //將消息顯示在網(wǎng)頁上

    function setMessageInnerHTML(innerHTML) {

        document.getElementById('message').innerHTML += innerHTML + '<br/>';

    }
</script>
<body>

</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谓形,一起剝皮案震驚了整個濱河市钉跷,隨后出現(xiàn)的幾起案子弥鹦,更是在濱河造成了極大的恐慌肚逸,老刑警劉巖爷辙,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朦促,居然都是意外死亡膝晾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門务冕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來血当,“玉大人,你說我怎么就攤上這事禀忆‰瘢” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵箩退,是天一觀的道長离熏。 經(jīng)常有香客問我,道長戴涝,這世上最難降的妖魔是什么滋戳? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮啥刻,結(jié)果婚禮上奸鸯,老公的妹妹穿的比我還像新娘。我一直安慰自己可帽,他們只是感情好娄涩,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著映跟,像睡著了一般蓄拣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上申窘,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天弯蚜,我揣著相機與錄音,去河邊找鬼剃法。 笑死碎捺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播收厨,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼晋柱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诵叁?” 一聲冷哼從身側(cè)響起雁竞,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拧额,沒想到半個月后碑诉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡侥锦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年进栽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恭垦。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡快毛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出番挺,到底是詐尸還是另有隱情唠帝,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布玄柏,位于F島的核電站襟衰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禁荸。R本人自食惡果不足惜右蒲,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赶熟。 院中可真熱鬧瑰妄,春花似錦、人聲如沸映砖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑退。三九已至竹宋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間地技,已是汗流浹背蜈七。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莫矗,地道東北人飒硅。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓砂缩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親三娩。 傳聞我的和親對象是個殘疾皇子庵芭,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,097評論 1 32
  • 當?shù)谝淮慰吹竭@個題目的時候,都感覺自己沒有成就事件雀监∷海看了別人的文章后,覺得他們真的非常棒会前。但是每個人的人生不...
    十三等于一閱讀 889評論 2 0
  • 教材:快學Scala chapter 14. 模式匹配和樣例類 Pattern Matching and Case...
    hakase_nano閱讀 237評論 0 0
  • 幾乎每年的清明時節(jié)都是雨紛紛好乐,可今年卻是艷陽高照,春和景明回官。 照舊我們一家三口到婆家祭拜了先人——我特...
    薔薇女士閱讀 133評論 0 0
  • 來來回回曹宴,刪來刪去的那些些焦慮。徘徊著不好的情緒歉提。那年夏天以為是幸福的開始,考慮了白發(fā)蒼蒼朝朝暮暮区转。我知道那是一條...
    金不換jbh閱讀 196評論 0 0