[文末贈(zèng)書]手把手教你SpringBoot整合websocket實(shí)現(xiàn)消息推送
點(diǎn)擊上方 Java學(xué)習(xí)之道,選擇 設(shè)為星標(biāo)
來源: segmentfault.com/a/1190000011908831
作者: kunm
依賴
springboot基礎(chǔ)環(huán)境,請參考springboot文檔 maven依賴
????????????org.springframework.boot
????????????spring-boot-starter-websocket
????????
環(huán)境準(zhǔn)備
準(zhǔn)備常量類
//webSocket相關(guān)配置
????//鏈接地址
????public?static?String?WEBSOCKETPATHPERFIX?=?"/ws-push";
????public?static?String?WEBSOCKETPATH?=?"/endpointWisely";
????//消息代理路徑
????public?static?String?WEBSOCKETBROADCASTPATH?=?"/topic";
????//前端發(fā)送給服務(wù)端請求地址
????public?static?final?String?FORETOSERVERPATH?=?"/welcome";
????//服務(wù)端生產(chǎn)地址,客戶端訂閱此地址以接收服務(wù)端生產(chǎn)的消息
????public?static?final?String?PRODUCERPATH?=?"/topic/getResponse";
????//點(diǎn)對點(diǎn)消息推送地址前綴
????public?static?final?String?P2PPUSHBASEPATH?=?"/user";
????//點(diǎn)對點(diǎn)消息推送地址后綴,最后的地址為/user/用戶識(shí)別碼/msg
????public?static?final?String?P2PPUSHPATH?=?"/msg";
接收前端消息實(shí)體
public?class?WiselyMessage?{
????private?String?name;
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
}
后臺(tái)發(fā)送消息實(shí)體
private?String?responseMessage;
????public?WiselyResponse(String?responseMessage){
????????this.responseMessage?=?responseMessage;
????}
????public?String?getResponseMessage()?{
????????return?responseMessage;
????}
????public?void?setResponseMessage(String?responseMessage)?{
????????this.responseMessage?=?responseMessage;
????}
配置websocket
@Configuration
//?@EnableWebSocketMessageBroker注解用于開啟使用STOMP協(xié)議來傳輸基于代理(MessageBroker)的消息,這時(shí)候控制器(controller)
//?開始支持@MessageMapping,就像是使用@requestMapping一樣。
@EnableWebSocketMessageBroker
public?class?WebSocketConfig?extends?AbstractWebSocketMessageBrokerConfigurer?{
????@Override
????public?void?registerStompEndpoints(StompEndpointRegistry?stompEndpointRegistry)?{
????????//注冊一個(gè)Stomp的節(jié)點(diǎn)(endpoint),并指定使用SockJS協(xié)議。
????????stompEndpointRegistry.addEndpoint(Constant.WEBSOCKETPATH).withSockJS();
????}
????@Override
????public?void?configureMessageBroker(MessageBrokerRegistry?registry)?{
????????//服務(wù)端發(fā)送消息給客戶端的域,多個(gè)用逗號(hào)隔開
????????registry.enableSimpleBroker(Constant.WEBSOCKETBROADCASTPATH,?Constant.P2PPUSHBASEPATH);
????????//定義一對一推送的時(shí)候前綴
????????registry.setUserDestinationPrefix(Constant.P2PPUSHBASEPATH);
????????//定義websoket前綴
????????registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);
????}
}
service
@Service
public?class?WebSocketService?{
????@Autowired
????private?SimpMessagingTemplate?template;
????/**
?????*?廣播
?????*?發(fā)給所有在線用戶
?????*
?????*?@param?msg
?????*/
????public?void?sendMsg(WiselyResponse?msg)?{
????????template.convertAndSend(Constant.PRODUCERPATH,?msg);
????}
????/**
?????*?發(fā)送給指定用戶
?????*?@param?users
?????*?@param?msg
?????*/
????public?void?send2Users(List?users,?WiselyResponse?msg)?{
????????users.forEach(userName?->?{
????????????template.convertAndSendToUser(userName,?Constant.P2PPUSHPATH,?msg);
????????});
????}
}
控制器
@Controller
public?class?WsController?{
????@Resource
????WebSocketService?webSocketService;
????@MessageMapping(Constant.FORETOSERVERPATH)//@MessageMapping和@RequestMapping功能類似,用于設(shè)置URL映射地址,瀏覽器向服務(wù)器發(fā)起請求,需要通過該地址。
????@SendTo(Constant.PRODUCERPATH)//如果服務(wù)器接受到了消息,就會(huì)對訂閱了@SendTo括號(hào)中的地址傳送消息。
????public?WiselyResponse?say(WiselyMessage?message)?throws?Exception?{
????????List?users?=?Lists.newArrayList();
????????users.add("d892bf12bf7d11e793b69c5c8e6f60fb");//此處寫死只是為了方便測試,此值需要對應(yīng)頁面中訂閱個(gè)人消息的userId
????????webSocketService.send2Users(users,?new?WiselyResponse("admin?hello"));
????????return?new?WiselyResponse("Welcome,?"?+?message.getName()?+?"!");
????}
}
頁面
"http://www.thymeleaf.org">
????"UTF-8"?/>
????Spring?Boot+WebSocket+廣播式
"disconnect()">
????
????????
????????
????
????"conversationDiv">
????????type="text"?id="name"?/>
????????
????????"response">
????????"response1">
????
測試

點(diǎn)擊連接控制臺(tái)輸出

表示連接成功并且訂閱了兩個(gè)地址

?此時(shí)在文本框內(nèi)輸入任意值 結(jié)果如圖所示則代表成功
?


?控制臺(tái)中顯示依次為,發(fā)送信息,目標(biāo)長度內(nèi)容
?

此時(shí)服務(wù)端控制器接收到請求

?同時(shí)給指定用戶發(fā)送了消息,所以控制臺(tái)接收到消息
?

?同時(shí)因?yàn)榭刂破饔凶⒔釦SendTo所以會(huì)向@SendTo的地址廣播消息,客戶端訂閱了廣播地址所有控制臺(tái)顯示接收了消息
?

從人們身邊常見的整數(shù)講起,逐步深入,介紹了數(shù)論、計(jì)數(shù)、圖論、機(jī)器學(xué)習(xí)等領(lǐng)域的一些典型算法及其原理,尤其是算法背后的數(shù)學(xué)原理,可以讓讀者輕松對算法建立更深入的理解。
「一等獎(jiǎng)」:1名 --《程序員數(shù)學(xué)從零開始》書籍一本 「二等獎(jiǎng)」:2 名 -- 現(xiàn)金紅包 9.99 元 「三等獎(jiǎng)」:3 名 -- 現(xiàn)金紅包 6.66 元 「幸運(yùn)獎(jiǎng)」:10名 -- 現(xiàn)金紅包 1 元
免費(fèi)獲取方法:
2月4日前,公眾號(hào)后臺(tái)回復(fù)?【?java學(xué)習(xí)?】即可參與活動(dòng)!!!
▲掃碼回復(fù)「java學(xué)習(xí)」抽獎(jiǎng)品 沒加小編微信的建議先加一下小編微信,方便中獎(jiǎng)之后安排發(fā)貨和領(lǐng)

評(píng)論
圖片
表情

