前言
創(chuàng)新互聯(lián)長(zhǎng)期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平鄉(xiāng)企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè),平鄉(xiāng)網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
QQ這類即時(shí)通訊工具多數(shù)是以桌面應(yīng)用的方式存在。在沒有websocket出現(xiàn)之前,如果開發(fā)一個(gè)網(wǎng)頁版的即時(shí)通訊應(yīng)用,則需要定時(shí)刷新頁面或定時(shí)調(diào)用ajax請(qǐng)求,這無疑會(huì)加大服務(wù)器的負(fù)載和增加了客戶端的流量。而websocket的出現(xiàn),則完美的解決了這些問題。
spring boot對(duì)websocket進(jìn)行了封裝,這對(duì)實(shí)現(xiàn)一個(gè)websocket網(wǎng)頁即時(shí)通訊應(yīng)用來說,變得非常簡(jiǎn)單。
一、準(zhǔn)備工作
pom.xml引入
org.springframework.boot spring-boot-starter-websocket
完整的pom.xml文件代碼如下:
<?xml version="1.0" encoding="UTF-8"?>4.0.0 com.example spring-boot-16 0.0.1-SNAPSHOT jar spring-boot-16 Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.3.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-websocket org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
二、代碼編寫
1.創(chuàng)建名為“WebSocketConfig.java”的類來配置websocket,并繼承抽象類“AbstractWebSocketMessageBrokerConfigurer”
此類聲明“@EnableWebSocketMessageBroker”的注解
package com.example; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/my-websocket").withSockJS(); } }
這里配置了以“/app”開頭的websocket請(qǐng)求url。和名為“my-websocket”的endpoint(端點(diǎn))
2.編寫一個(gè)DTO類來承載消息:
package com.example; public class SocketMessage { public String message; public String date; }
3.創(chuàng)建App.java類,用于啟用spring boot和用于接收、發(fā)送消息的控制器。
package com.example; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller @EnableScheduling @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } @Autowired private SimpMessagingTemplate messagingTemplate; @GetMapping("/") public String index() { return "index"; } @MessageMapping("/send") @SendTo("/topic/send") public SocketMessage send(SocketMessage message) throws Exception { DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); message.date = df.format(new Date()); return message; } @Scheduled(fixedRate = 1000) @SendTo("/topic/callback") public Object callback() throws Exception { // 發(fā)現(xiàn)消息 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); messagingTemplate.convertAndSend("/topic/callback", df.format(new Date())); return "callback"; } }
“send”方法用于接收客戶端發(fā)送過來的websocket請(qǐng)求。
@EnableScheduling注解為:?jiǎn)⒂胹pring boot的定時(shí)任務(wù),這與“callback”方法相呼應(yīng),用于每隔1秒推送服務(wù)器端的時(shí)間。
4.在“resources/templates”目錄下創(chuàng)建index.html文件:
玩轉(zhuǎn)spring boot——websocket 玩轉(zhuǎn)spring boot——websocket
出處:劉冬博客 http://www.cnblogs.com/goodhelper
消息列表:
內(nèi)容 時(shí)間 {{row.message}} {{row.date}}
除了引用angular.js的CDN文件外,還需要引用sockjs和stomp。
完整的項(xiàng)目結(jié)構(gòu),如下圖所示:
三、運(yùn)行效果
點(diǎn)擊“連接”按鈕,出現(xiàn)發(fā)送消息的輸入框。并接收到服務(wù)器端的時(shí)間推送。
輸入發(fā)送內(nèi)容并點(diǎn)擊“發(fā)送”按鈕后,頁面顯示出剛才發(fā)送的消息。
點(diǎn)擊“斷開”按鈕,則服務(wù)器端不會(huì)再推送消息。
總結(jié)
在開發(fā)一個(gè)基于web的即時(shí)通訊應(yīng)用的過程中,我們還需考慮session的機(jī)制。
還需要一個(gè)集合來承載當(dāng)前的在線用戶,并做一個(gè)定時(shí)任務(wù),其目的是用輪詢的方式定時(shí)處理在線用戶的狀態(tài),有哪些用戶在線,又有哪些用戶離線。
參考:
http://spring.io/guides/gs/scheduling-tasks/
http://spring.io/guides/gs/messaging-stomp-websocket/
代碼地址:https://github.com/carter659/spring-boot-16
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。