springboot中websoket的使用

2022-01-14 00:33:28 字數 2778 閱讀 9869

知識點:springboot專案中,websoket實時推送技術的介紹與使用

一、雙向通訊

http協議通訊只能由客戶端發起請求,服務端返回查詢結果,如果我們想定時獲取服務端的狀態變化,相對麻煩一點,websoket協議之前,可以通過輪詢,長輪詢,iframe流的方式實現,(可參考我以前在乙個專案裡,做了乙個使用者搶登入的功能(乙個賬戶同一時間只能由乙個使用者登入,如果之後有人登入,那麼之前登入的使用者就強制退出),用的是很簡單的輪詢,客戶端定時向後台發請求,知道有新使用者登入以後,則下線,但是缺點是輪詢的間隔過長,會導致使用者不能及時接收到更新的資料;輪詢的間隔過短,會導致查詢請求過多,增加伺服器端的負擔,所以如果伺服器端一旦知道新使用者登陸了,主動向客戶端發訊息,就避免了一些不必要的請求,可以用websoket技術

三:實現**

1.引入mvn依賴

org.springframework.bootgroupid>

spring-boot-starter-websocketartifactid>

dependency>

2.啟用websoket支援

@configuration

public class websocketconfig

}

3.server端:

@serverendpoint("/websocket_server")

@component

public class websocketserver implements initializingbean catch (exception e) }}

/*** 連線關閉呼叫的方法

*/@onclose

public void onclose()

/*** 收到客戶端訊息後呼叫的方法

* @param message 客戶端傳送過來的訊息

*/@onmessage

public void onmessage(string message) else

} catch (ioexception e) }}

/*** 發生錯誤時呼叫

* @param session

* @param error

*/@onerror

public void onerror(session session, throwable error)

/*** 這個方法與上面幾個方法不一樣。沒有用註解,是根據自己需要新增的方法。

* 實現伺服器主動推送

* @param message

* @throws ioexception

*/public void sendmessage(string message) throws ioexception

public static synchronized int getonlinecount()

public static synchronized void addonlinecount()

public static synchronized void subonlinecount()

@override

public void afterpropertiesset() throws exception

public websocketserver()

}

5.頁面發起soket請求

websoket測試頁

div>

div>

debugger

var websocket = null;

var lockreconnect = false; //避免ws重複連線

var wsurl="ws:";

createwebsocket(wsurl);

function createwebsocket(url) else if ('mozwebsocket' in window)else

initeventhandle(url);

}catch(e)

}function initeventhandle(url) ;

/* 連線成功建立的**方法 */

websocket.onopen = function()

/* 接收到訊息的**方法 */

websocket.onmessage = function(event) }}

/* 連線關閉的**方法 */

websocket.onclose = function()

}/* 監聽視窗關閉事件,當視窗關閉時,主動去關閉websocket連線,防止連線還沒斷開就關閉視窗,server端會拋異常。 */

window.onbeforeunload = function()

/* 將訊息顯示在網頁上 */

function setmessageinnerhtml(innerhtml)

/* 關閉websocket連線 */

function closewebsocket()

/* 傳送訊息 */

function send() ';

websocket.send(message);

}**放不下了

,可以參考原始碼

很久前設計的webs管理器

webshell管理分為控制端和受控端,受控端使用指令碼實現,很簡單,就是乙個一句話木馬,控制端可以向受控端傳送指令碼命令來使受控端執行特定的程式。所以,比較重要的就是指令碼的編寫了,因此,程式的可擴充套件性要求就比較高了,所以,我想的也簡單,程式只做出一些介面方法,剩下的所有功能交給指令碼去實現,...

Springboot中Thymeleaf外部模板

spingboot專案中,預設的thymeleaf模板資料夾是在 src main resources templates,打包時後在classpath templates下 jar包同目錄下的 templates 目錄 spring.thymeleaf.prefix file templates ...

springboot中controller無法訪問

configuration 該註解將類可以看成配置檔案,通常和 bean配合使用 enableautoconfiguration 在程式啟動時自動載入配置 componentscan 會自動掃瞄指定包下的全部標有 component的類,並註冊成bean,當然包括 component下的子註解 se...