太贊了,竟然用SpringBoot打造一款網頁版的IM,進行聊天...

2021-02-15 網際網路架構師

目錄

傳統 Tomcat 開發 WebSocket 回顧

WebSocket 的出現是基於 Web 應用的實時性需要而產生的,在淘寶、京東等網頁客服、網頁賣家聊天等需求上應用廣泛。對於前端網頁可以使用 H5 開發 WebSocket 客戶端,也可以使用 SockJS 庫開發 WebSocket 客戶端。

對於Java 開發者而言,後臺 WebSocket 服務端開發通常有以下常用的選擇:

Tomcat8 如下所示,自身已經支持 WebSocket 服務端開發,它的 lib 目錄下有自己實現 WebSocket 協議的開發包,如果是傳統的 Java Web 項目,則只需要將 tomcat-websocket.jar、websocket-api.jar 導入應用中即可進行代碼開發。

Tomcat 自身也提供了 WebSocket 開發的示例,在 webapps/exampls下,一共提供了 4 個示例,可以啟動 Tomcat 進行訪問測試以及學習:

對於傳統 Java Web 導包式應用開發,這裡不再過多進行說明,它的基本流程是:

1)新建 Java Web 應用後,導入 Tomcat 伺服器 lib 目錄下的 websocket-api.jar 、tomcat-websocket.jar開發包,前者是瀏覽器 webSocket 規範的接口,後者是 Tomcat 對它的實現

2)創建後臺 webSocket 服務端類,標識 @ServerEndpoint( javax.websocket.server.ServerEndpoint)註解,表示當前類是 webSocket 服務終端,同時在裡面實現客戶端連接建立、發送消息、接收消息等通信業務。

3)自己實現 javax.websocket.server.ServerApplicationConfig 接口,掃描整個應用所有的 @ServerEndpoint 服務終端

SpringBoot 整合 Tomcat  WebSocket

本文的重點是 SpringBoot 項目如何使用 Tomcat 的 webSocket 服務端開發;本文環境:springboot 2.1.0 ,使用內置的 Tomcat 伺服器。

Spring boot 創建的 web 應用,web 啟動模塊已經依賴了 tomcat-websocket 模塊,所以不需要再重複導入,但是必須導入 Spring boot 的 websocket 啟動模塊 spring-boot-starter-websocket。

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

@ServerEndpoint 創建 websocket 服務終端

1、創建後臺 webSocket 服務端類,標識 @ServerEndpoint( javax.websocket.server.ServerEndpoint)註解,表示當前類是 webSocket 服務終端,同時在裡面實現客戶端連接建立、發送消息、接收消息等通信業務。

2、這與傳統導包式開發 Tomcat WebSocket 服務端是一樣的,區別就是:傳統方式 @ServerEndpoint 類上不需要加 @Component 交由 Spring 管理,而現在需要加上 @Component 將此組件交由 spring 管理。

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import javax.websocket.*;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.HashSet;import java.util.Set;@ServerEndpoint(value = "/websocket/yy.action")@Componentpublic class ServerEnpoint {    private static Logger logger = LoggerFactory.getLogger(ServerEnpoint.class);        private static Set<Session> sessionSet = new HashSet<>();        @OnOpen    public void afterConnectionEstablished(Session session) {                sessionSet.add(session);        logger.info("新客戶端加入,session id=" + session.getId() + ",當前客戶端格個數為:" + sessionSet.size());                 session.getAsyncRemote().sendText("我是伺服器,你連接成功!");    }        @OnClose    public void afterConnectionClosed(Session session) {        sessionSet.remove(session);        logger.info("客戶端斷開,session id=" + session.getId() + ",當前客戶端格個數為:" + sessionSet.size());    }        @OnMessage    public void handleMessage(Session session, String textMessage) {        try {            logger.info("接收到客戶端信息,session id=" + session.getId() + ":" + textMessage);                        session.getBasicRemote().sendText(textMessage);        } catch (IOException e) {            e.printStackTrace();        }    }        @OnError    public void handleTransportError(Session session, Throwable throwable) {        System.out.println("shake client And server handleTransportError,session.getId()=" + session.getId() + " -- " + throwable.getMessage());        logger.error("與客戶端 session id=" + session.getId() + " 通信錯誤...");    }}

注入 ServerEndpointExporter

1、注入 org.springframework.web.socket.server.standard.ServerEndpointExporter,這個 bean 會自動註冊使用了@ServerEndpoint 註解聲明的 Websocket endpoint 。

2、如果使用獨立的 servlet 容器,而不是使用 spring boot 的內置容器,就不要注入ServerEndpointExporter,因為它將由 Tomcat 容器自己提供和管理。

3、因為傳統導包式 Tomcat websocket 開發時,是需要實現 javax.websocket.server.ServerApplicationConfig 接口的,然後由它去掃描整個應用中的 @ServerEndpoint,而現在這一步就由 springboot 的 ServerEndpointExporter 取代了。

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configurationpublic class WebSocketConfig {        @Bean    public ServerEndpointExporter serverEndpointExporter() {        return new ServerEndpointExporter();    }}

前端 H5 webSocket 客戶端

為了方便,直接使用 H5 的 webSocket 方式,頁面的 html 與 css 樣式就不做提供了,直接提供客戶端 webSocket 的 js 代碼。

var ws = null;function webSocketBind() {        if ("WebSocket" in window) {                ws = new WebSocket("ws://192.168.1.20/yyServer/websocket/yy.action");                 ws.onopen = function () {                                        console.log("伺服器連接成功,並發送數據到後臺...");        };                 ws.onmessage = function (evt) {            var received_msg = evt.data;            console.log("接收到伺服器數據:" + received_msg);            showClientMessage(received_msg);        };                 ws.onerror = function (evt) {            console.log("客戶端 與 伺服器 數據傳輸錯誤...");        };                 ws.onclose = function () {            console.log("web scoket 連接關閉...");        };    } else {        alert("您的瀏覽器不支持 WebSocket!");    }} let showServerMessage = function (message) {    if (message != undefined && message.trim() != "") {                ws.send(message.trim());                let messageShow = "<div class='messageLine server'><div class='messageContent serverCon'>" + message + "</div><span>:我</span>";        $(".centerTop").append(messageShow + "<br>");        $(".messageArea").val("");         let scrollHeight = $(".centerTop")[0].scrollHeight;        $(".centerTop").scrollTop(scrollHeight - $(".centerTop").height());    }}; let showClientMessage = function (message) {    if (message != undefined && message.trim() != "") {                let messageShow = "<div class='messageLine client'><span>伺服器:</span><div class='messageContent clientCon'>" + message + "</div>";        $(".centerTop").append(messageShow + "<br>");        $(".messageArea").val("");         let scrollHeight = $(".centerTop")[0].scrollHeight;        $(".centerTop").scrollTop(scrollHeight - $(".centerTop").height());    }}; $(function () {        $(".messageArea").val("");         $(".sendButton").click(function () {        let message = $(".messageArea").val();        showServerMessage(message);    });         $(window).keydown(function (event) {        if (event.keyCode === 13) {            let message = $(".messageArea").val();            showServerMessage(message);        }    });        webSocketBind();});

websocket 通信測試

作者:蚩尤後裔

來源:https://blog.csdn.net/wangmx1993328/article/details/84582904

相關焦點

  • 跟著源碼一起學:手把手教你用WebSocket打造Web端IM聊天
    一、引言WebSocket如今在Web端即時通訊技術應用裡使用廣泛,不僅用於傳統PC端的網頁裡,也被很多移動端開發者用於基於HTML5的混合APP裡。對於想要在基於Web的應用裡添加IM、推送等實時通信功能,WebSocket幾乎是必須要掌握的技術。
  • WhatsApp推網頁版 用戶可用電腦進行聊天
    今天,WhatsApp已經當之無愧成為手機聊天的第一名。在佔領了手機端之後,WhatsApp已經開始了下一步的擴張舉動。日前,WhatsApp終於推出了支持谷歌(微博)Chrome瀏覽器的網頁版客戶端。這意味著更多的電腦用戶,也能夠使用WhatsApp來聊天了。
  • 使用 WebSocket 打造網頁 IM 聊天,看不懂就錘爆艿艿的狗頭~
    例如說,聊天 IM 即使通訊功能、消息訂閱服務、網頁遊戲等等。同時,因為 WebSocket 使用 TCP 通信,可以避免重複創建連接,提升通信質量和效率。例如說,美團的長連接服務,具體可以看看 《美團點評行動網路優化實踐》 。
  • 什麼是網頁即時聊天工具
    最近有不少人在找一款能夠在網頁上實現聊天功能的網頁即時聊天工具,由於資源比較難整理,小編在這邊給大家推薦一款免費好用的網頁即時聊天程序供大家下載
  • 微信網頁版怎麼用 微信網頁版登陸方法
    如有侵權,請在後臺留言聯繫我們進行刪除,謝謝!微信是我們大部分玩手機的朋友離不開的社交軟體,使用微信app能夠讓你更加方便的與自己的親朋好友聊天。有的朋友想用電腦登陸微信,該怎麼操作呢?下面2265小編給大家帶來微信網頁版登錄方法。
  • 搭建自己的聊天伺服器(Element篇)
    Matrix 是一種用於即時通訊的開放協定。它允許擁有一個通訊服務提供商帳戶的用戶與不同服務提供商的用戶進行網路聊天,IP語音和影片電話。也就是說,它旨在使不同服務提供商之間的即時通訊無縫工作,就像使用電子郵件一樣。採用該協定的軟體有Riot.im。
  • Signal | 實在是不得不推薦的一款聊天軟體
    不想錯過消息更新的,不妨星標一下喔🌟聰明的大夥日常聊天的時候有沒有出現那些欲言又止的時刻?甚至明明是打好了,卻感覺不太好發送?AND A NONPROFIT 開源、非營利項目據說用的是OpenWhisperSystems,但博主的tech背景還真是半桶水,不要找我解釋這個  反正這款APP主打是私密性:)
  • 區域網禁止微信聊天傳文件、路由器禁止微信網頁版登陸的方法
    微信已經成為時下最流行的聊天軟體之一,很多員工上班時間都會使用微信聊天,並且很多還是通過在電腦上登陸微信網頁版進行聊天。
  • 簡單好用的網頁版音頻編輯器 Probe
    網頁版音樂 App?HTML 鼓機?
  • 奇葩需求:springboot項目註冊為windows系統服務並設置開機自啟
    點擊上方藍色字體,選擇「標星公眾號」關注公眾號後臺回復pay或mall獲取實戰項目資料視頻作者:雙主雙機熱備來源:http://suo.im關於springboot項目部署相對於之前簡化了一些步驟,只需要在伺服器中安裝好jdk環境,然後執行java -jar xxx.jar就可以把項目跑起來,如下所示。我們通過傳統--->改進版--->改進版plus--->最終版演變方式來一步步探討一下。
  • 開源版IM即時聊天工具
    IM即時通訊,我們並不陌生,QQ、微信、飛信、yy、msn等專注於即時通訊的平臺獨樹一幟,早已將即時通訊打造為PC時代的三大盈利模式之一。我們熟知的IM即時通訊是什麼?微信=IM?
  • 【乾貨】谷歌調整,優先抓取移動版網站網頁!
    歌搜索史上最大調整,優先抓取移動版網站網頁。谷歌是全世界最大的網頁搜尋引擎,也是搜尋引擎市場的鼻祖。移動網際網路時代的到來,也促使谷歌對於搜索業務進行調整。本周四,谷歌宣布了搜索業務有史以來最重大的一項調整,谷歌表示將會優先抓取移動版網站的網頁,媒體稱,這意味著未來在手機端和電腦端使用谷歌搜索,也將會得到不同的結果。
  • 花30分鐘,用Jenkins部署碼雲上的SpringBoot項目
    來源:juejin.im/post/5be1a485f265da612859974c持續交付的概念,
  • WhatsApp推出網頁版!以後上班時也能偷偷聊天囉~
    ,那你就要快點學會怎麼用 WhatsApp 全新推出的網頁版啦!可惜的是暫時網頁版只開放給 Android、BlackBerry、BB10、Nokia S60 及 Windows Phone 手機 ~希望 WhatsApp 網頁版可以快點開放給 iPhone 用戶!
  • 【微信】刪了的聊天記錄竟然可以恢復?
    帶著這個疑問,記者在網上做了一番搜索,在百度上搜索微信聊天記錄刪除了怎麼恢復後,竟然搜索到了2,870,000個搜索結果,其中一篇介紹「樓月微信聊天記錄導出恢復助手」軟體的網頁引起了記者的注意。從網頁給出的截圖看,該軟體成功恢復回來了很多刪除的微信聊天記錄。
  • Facebook是真想拆分Messenger:推出網頁版
    =======北京時間4月9日早間消息,Facebook本周推出了消息服務Messenger單獨的網頁版Messenger.com。此前在移動平臺上,Facebook將Messenger分拆為一款獨立應用曾引起爭議。不過,Facebook網站仍將支持Messenger消息功能,用戶仍可以在Facebook網站內與好友聊天。
  • Apple Music網頁版上線,蘋果的變革正在進行
    與此同時,網頁版也同樣支持通過歌曲/藝人/專輯進行搜索,並可將其添加至資料庫,而資料庫也會與客戶端進行同步。值得一提的是,蘋果為Apple Music服務提供網頁版的好處之一,顯然在於將不再依賴於作業系統。用戶可以在沒有iTunes或 Apple Music應用的電腦或移動終端上使用這一服務。
  • 這些常用國產軟體的國際版竟TM這麼好用!
    QQ國際版,簡潔乾淨的QQ軟體QQ近些年雖說用戶量活躍度每況愈下,不及兄弟產品微信,但它仍然是許多人辦公的首選,經過數次版本的更迭,現在的功能已幾近完善,目前的更新主要是添加各種小功能,對於許多人來說,可能更迫切的需要一款簡簡單單只專注聊天的工具。
  • Springboot @EnableWebMvc 註解
    }並且如果容器中存在  WebMvcConfigurationSupport 這個類,那麼 springboot 對於 springmvc 的自動配置將會失效可以看到這個類中都是一些空方法,只是保留了最基本的 MVC 的功能,並不具備其它的擴展功能如下:springboot 對於 mvc 模塊的配置就在 WebMvcAutoConfiguration
  • 微信網頁版更新功能.什麼?!微信還有網頁版?
    但你又可知道,其實有種東西叫微信網頁版。這麼棒的東西我。。。我居然完全不知道!微信網頁版已經出現了很長一段時間並且功能不斷在豐富而最近它又更新了五項新的功能。就是今天更新的微信網頁版,想體驗嗎,登錄https://wx.qq.com/試試吧~  很多小夥伴比較不解,為什麼還要用微信網頁版,微信PC客戶端已經做的很好啦,和使用電腦版本的QQ的體驗已經相當啦!那微互動就給你扒一下,為什麼今天推薦的是微信網頁版!