




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】SpringBoot怎么使用WebSocket實(shí)現(xiàn)群發(fā)消息
這篇文章主要介紹了SpringBoot怎么使用WebSocket實(shí)現(xiàn)群發(fā)消息的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇SpringBoot怎么使用WebSocket實(shí)現(xiàn)群發(fā)消息文章都會(huì)有所收獲,下面我們一起來看看吧。WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,已被W3C定為標(biāo)準(zhǔn)。使用WebSocket可以使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單。在WebSocket協(xié)議中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以直接創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。特點(diǎn)WebSocket使用時(shí)需要先創(chuàng)建連接,這使得Websocket成為一種有狀態(tài)的協(xié)議,在之后的通信過程中可以省略部分狀態(tài)信息(例如身份認(rèn)證等)。WebSocket連接在端口80(ws)或者443(wss)上創(chuàng)建,與HTTP使用的端口相同,這樣,基本上所有的防火墻都不會(huì)阻止WebSocket連接。WebSocket使用HTTP協(xié)議進(jìn)行握手,因此它可以自然而然地集成到網(wǎng)絡(luò)瀏覽器和HTTP服務(wù)器中,而不需要額外的成本。心跳消息(ping和pong)將被反復(fù)的發(fā)送,進(jìn)而保持WebSocket連接一直處于活躍狀態(tài)。使用該協(xié)議,當(dāng)消息啟動(dòng)或者到達(dá)的時(shí)候,服務(wù)端和客戶端都可以知道。WebSocket連接關(guān)閉時(shí)將發(fā)送一個(gè)特殊的關(guān)閉消息。WebSocket支持跨域,可以避免Ajax的限制。HTTP規(guī)范要求瀏覽器將并發(fā)連接數(shù)限制為每個(gè)主機(jī)名兩個(gè)連接,但是當(dāng)我們使用Websocket的時(shí)候,當(dāng)握手完成之后,該限制就不存在了,因?yàn)榇藭r(shí)的連接已經(jīng)不再是HTTP連接了。WebSocket協(xié)議支持?jǐn)U展,用戶可以擴(kuò)展協(xié)議,實(shí)現(xiàn)部分自定義的子協(xié)議。WebSocket擁有更好的二進(jìn)制支持以及更好的壓縮效果。一、添加依賴<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>二、配置WebSocketSpring框架提供了基于WebSocket的STOMP支持,STOMP是一個(gè)簡(jiǎn)單的可互操作的協(xié)議,通常被用于通過中間服務(wù)器在客戶端之間進(jìn)行異步消息傳遞。@Configuration
@EnableWebSocketMessageBroker
public
class
WebSocketConfig
implements
WebSocketMessageBrokerConfigurer
{
@Override
public
void
configureMessageBroker(MessageBrokerRegistry
config)
{
//
設(shè)置消息代理的前綴,如果消息的前綴為"/topic",就會(huì)將消息轉(zhuǎn)發(fā)給消息代理(broker)
//
再由消息代理廣播給當(dāng)前連接的客戶端
config.enableSimpleBroker("/topic");
//
下面方法可以配置一個(gè)或多個(gè)前綴,通過這些前綴過濾出需要被注解方法處理的消息。
//
例如這里表示前綴為"/app"的destination可以通過@MessageMapping注解的方法處理
//
而其他
destination(例如"/topic""/queue")將被直接交給
broker
處理
config.setApplicationDestinationPrefixes("/app");
}
@Override
public
void
registerStompEndpoints(StompEndpointRegistry
registry)
{
//
定義一個(gè)前綴為"/chart"的endpoint,并開啟
sockjs
支持。
//
sockjs
可以解決瀏覽器對(duì)WebSocket的兼容性問題,客戶端將通過這里配置的URL建立WebSocket連接
registry.addEndpoint("/chat").withSockJS();
}
}三、服務(wù)端代碼根據(jù)上面WebSocketConfig的配置,@MessageMapping("/hello")注解的方法將用來接收“/app/hello”路徑發(fā)送來的消息,在注解方法中對(duì)消息進(jìn)行處理后,再將消息轉(zhuǎn)發(fā)到@SendTo定義的路徑上。而@SendTo路徑是一個(gè)前綴為“/topic”的路徑,因此該消息被交給消息代理broker,再由broker進(jìn)行廣播。@Controller
public
class
DemoController
{
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public
Message
greeting(Message
message)
throws
Exception
{
return
message;
}
}@Data
public
class
Message
{
private
String
name;
private
String
content;
}四、前端代碼
在resources/static目錄下創(chuàng)建chat.html頁(yè)面作為聊天頁(yè)面。<!DOCTYPE
html>
<html
lang="en">
<head>
<meta
charset="UTF-8">
<title>群聊</title>
<script
src="/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
src="/ajax/libs/sockjs-client/1.1.2/sockjs.min.js"></script>
<script
src="/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
<script>
var
stompClient
=
null;
//
根據(jù)是否已連接設(shè)置頁(yè)面元素狀態(tài)
function
setConnected(connected)
{
$("#connect").prop("disabled",
connected);
$("#disconnect").prop("disabled",
!connected);
if
(connected)
{
$("#conversation").show();
$("#chat").show();
}
else
{
$("#conversation").hide();
$("#chat").hide();
}
$("#greetings").html("");
}
//
建立一個(gè)WebSocket連接
function
connect()
{
//
用戶名不能為空
if
(!$("#name").val())
{
return;
}
//
首先使用
SockJS
建立連接
var
socket
=
new
SockJS('/chat');
//
然后創(chuàng)建一個(gè)STOMP實(shí)例發(fā)起連接請(qǐng)求
stompClient
=
Stomp.over(socket);
//
連接成功回調(diào)
stompClient.connect({},
function
(frame)
{
//
進(jìn)行頁(yè)面設(shè)置
setConnected(true);
//
訂閱服務(wù)端發(fā)送回來的消息
stompClient.subscribe('/topic/greetings',
function
(greeting)
{
//
將服務(wù)端發(fā)送回來的消息展示出來
showGreeting(JSON.parse(greeting.body));
});
});
}
//
斷開WebSocket連接
function
disconnect()
{
if
(stompClient
!==
null)
{
stompClient.disconnect();
}
setConnected(false);
}
//
發(fā)送消息
function
sendName()
{
stompClient.send("/app/hello",
{},
JSON.stringify({'name':
$("#name").val(),'content':$("#content").val()}));
}
//
將服務(wù)端發(fā)送回來的消息展示出來
function
showGreeting(message)
{
$("#greetings")
.append("<div>"
+
+":"+message.content
+
"</div>");
}
//
頁(yè)面加載后進(jìn)行初始化動(dòng)作
$(function
()
{
$(
"#connect"
).click(function()
{
connect();
});
$(
"#disconnect"
).click(function()
{
disconnect();
});
$(
"#send"
).click(function()
{
sendName();
});
});
</script>
</head>
<body>
<div>
<label
for="name">請(qǐng)輸入用戶名:</label>
<input
type="text"
id="name"
placeholder="用戶名">
</div>
<div>
<button
id="connect"
type="button">連接</button>
<button
id="disconnect"
type="button"
disabled="disabled">斷開連接</button>
</div>
<div
id="chat"
>
<div>
<label
for="name">請(qǐng)輸入聊天內(nèi)容:</label>
<input
type="text"
id="content"
placeholder="聊天內(nèi)容">
</div>
<button
id="send"
type="button">發(fā)送</button>
<div
id="greetings">
<div
id="conversation"
>群聊進(jìn)行中...</div>
</div>
</div>
</body>
</html>SockJS是一個(gè)瀏覽器JavaScript庫(kù),提供類似于WebSocket的對(duì)象。SockJS為您提供了一個(gè)一致
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)鋰電池正極材料市場(chǎng)發(fā)展趨勢(shì)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)鋁冶煉行業(yè)運(yùn)行動(dòng)態(tài)與前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)菱鎂礦產(chǎn)業(yè)競(jìng)爭(zhēng)格局與十三五規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)聯(lián)苯雙酯行業(yè)市場(chǎng)運(yùn)行狀況與十三五規(guī)劃分析報(bào)告
- 2025-2030年中國(guó)粘玉米行業(yè)規(guī)模分析及發(fā)展建議研究報(bào)告
- 2025-2030年中國(guó)空管系統(tǒng)市場(chǎng)十三五規(guī)劃與投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)畜禽養(yǎng)殖中抗生素行業(yè)發(fā)展?fàn)顩r及投資戰(zhàn)略研究報(bào)告
- 東北財(cái)經(jīng)大學(xué)《中醫(yī)護(hù)理學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東江門幼兒師范高等??茖W(xué)?!睹嫦?qū)ο笈c可視化編程》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州工商學(xué)院《健康服務(wù)與營(yíng)銷學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 《綠色建筑設(shè)計(jì)原理》課件
- 中華人民共和國(guó)學(xué)前教育法-知識(shí)培訓(xùn)
- 2023年新高考(新課標(biāo))全國(guó)2卷數(shù)學(xué)試題真題(含答案解析)
- 事業(yè)單位工作人員獎(jiǎng)勵(lì)審批表
- 人教版六年級(jí)美術(shù)下冊(cè)全冊(cè)課件【完整版】
- GB/T 9788-1988熱軋不等邊角鋼尺寸、外形、重量及允許偏差
- 教科版三年級(jí)下冊(cè)科學(xué)全冊(cè)完整課件
- 軌道交通安全專題培訓(xùn)
- 物理化學(xué)完整版答案
- 節(jié)流孔板孔徑計(jì)算
- 學(xué)生流失率考核辦法(試行)
評(píng)論
0/150
提交評(píng)論