websocket-01

一、為什么有websocket

主流web應(yīng)用使用的http協(xié)議只能進行單向訪問级及,要想實時通信只能通過輪詢的方式實現(xiàn)颖变,而高頻度的輪詢十分消耗性能,此時就體現(xiàn)了websocket的優(yōu)點

  1.支持雙向通信矢否,可以實現(xiàn)服務(wù)端與客戶端的主動收發(fā)消息
  2.較少的控制開銷:在連接創(chuàng)建后,服務(wù)器和客戶端之間交換數(shù)據(jù)時脑溢,用于協(xié)議控制的數(shù)據(jù)包頭部相對較小

二僵朗、Websocket簡介

WebSocket 是一種網(wǎng)絡(luò)傳輸協(xié)議,可在單個 TCP 連接上進行全雙工通信屑彻,位于 OSI 模型的應(yīng)用層
websocket應(yīng)用場景:
1.聊天室
2.實時告警

三验庙、Websocket應(yīng)用(Java springboot)

1.引入依賴

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

2.創(chuàng)建配置類

@Configuration
//@EnableWebSocketMessageBroker
@EnableWebSocket
public class WSConfig implements WebSocketConfigurer  {

    @Autowired
    private MyWebSocketHandler webSocketHandler;


    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler, "/my-websocket").setAllowedOrigins("*");
    }

}

這里可以使用@EnableWebSocket(簡單應(yīng)用) 或者 @EnableWebSocketMessageBroker(消息代理功能 通俗的講就是復雜封裝了)
@EnableWebSocketMessageBroker:該配置類中使用@EnableWebSocketMessageBroker注解來啟用WebSocket消息代理功能,使用configureMessageBroker方法來配置消息代理的相關(guān)參數(shù)社牲,使用registerStompEndpoints方法來注冊Stomp協(xié)議的WebSocket端點

3.創(chuàng)建處理類
這里需要使用webSocketSession 進行收發(fā)消息粪薛,而正常在業(yè)務(wù)類中獲取webSocketSession 較為復雜,這里使用封裝好的方法里獲取搏恤,即建立連接時執(zhí)行afterConnectionEstablished方法违寿,在這里保存session让禀,斷開連接執(zhí)行afterConnectionClosed,刪除session

@Component
@Slf4j
public class MyWebSocketHandler  extends TextWebSocketHandler{

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        log.info("WebSocket connection established");
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        log.info("Received message: " + payload);

        // 回復消息給客戶端
        try {
            session.sendMessage(new TextMessage("Hello, client! You said: " + payload));
        } catch (IOException e) {
            log.error("Error sending message to session: " + session.getId(), e);
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
        log.info("WebSocket connection closed");
    }

    private static final CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
    public void sendMessageToAll(String message) {
//        log.info("Sending message to all sessions: {}", message);
        for (WebSocketSession session : sessions) {
            try {
                session.sendMessage(new TextMessage(message));
                log.info("Sending message to all sessions: successful");
            } catch (IOException e) {
                log.error("Error sending message to session {}: {}", session.getId(), e.getMessage());
            }
        }
    }


}

4.實際業(yè)務(wù)類中使用
通過控制臺日志可以查看收發(fā)消息是否成功

    @Override
    public void run(ApplicationArguments args) throws Exception{
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");

        while (true){
            Thread.sleep(3000);
            String time = simpleDateFormat.format(new Date());
            webSocketHandler.sendMessageToAll("發(fā)送消息咯 --- " + time);
        }

    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陨界,一起剝皮案震驚了整個濱河市巡揍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菌瘪,老刑警劉巖腮敌,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俏扩,居然都是意外死亡糜工,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門录淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌木,“玉大人,你說我怎么就攤上這事嫉戚∨亳桑” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵彬檀,是天一觀的道長帆啃。 經(jīng)常有香客問我,道長窍帝,這世上最難降的妖魔是什么努潘? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坤学,結(jié)果婚禮上疯坤,老公的妹妹穿的比我還像新娘。我一直安慰自己深浮,他們只是感情好压怠,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著略号,像睡著了一般刑峡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玄柠,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音诫舅,去河邊找鬼羽利。 笑死,一個胖子當著我的面吹牛刊懈,可吹牛的內(nèi)容都是我干的这弧。 我是一名探鬼主播娃闲,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匾浪!你這毒婦竟也來了皇帮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蛋辈,失蹤者是張志新(化名)和其女友劉穎属拾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冷溶,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡渐白,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逞频。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯衍。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苗胀,靈堂內(nèi)的尸體忽然破棺而出襟诸,到底是詐尸還是另有隱情,我是刑警寧澤基协,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布励堡,位于F島的核電站,受9級特大地震影響堡掏,放射性物質(zhì)發(fā)生泄漏应结。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一泉唁、第九天 我趴在偏房一處隱蔽的房頂上張望鹅龄。 院中可真熱鬧,春花似錦亭畜、人聲如沸扮休。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玷坠。三九已至,卻和暖如春劲藐,著一層夾襖步出監(jiān)牢的瞬間八堡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工聘芜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兄渺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓汰现,卻偏偏與公主長得像挂谍,于是被迫代替她去往敵國和親叔壤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 前言 HTTP 協(xié)議是一種無狀態(tài)的口叙、無連接的炼绘、單向的應(yīng)用層協(xié)議。它采用了請求/響應(yīng)模型妄田。通信請求只能由客戶端發(fā)起俺亮,...
    小波同學閱讀 10,767評論 3 32
  • 目錄 WebSocket 簡介 Java 使用 WebSocket 的方式 SpringBoot 集成 WebSo...
    GardenAndDog閱讀 18,026評論 2 5
  • 為什么學習Python? 通過什么途徑學習的Python形庭? 上網(wǎng)收集視頻铅辞,資料 關(guān)注公證號 買教程,書籍 Pyth...
    130920閱讀 1,213評論 0 0
  • 第一部分 Python基礎(chǔ)篇(80題) 1萨醒、為什么學習Python斟珊? Python相對于其他編程語言有很多優(yōu)點: ...
    清清子衿木子水心閱讀 1,707評論 0 1
  • 什么是Websocket Websocket 是一種在單個TCP連接上進行全雙工通信的協(xié)議。WebSocket連接...
    殷天文閱讀 11,938評論 1 10