See more: Spring WebSocket reference
整個(gè)例子屬于WiseMenuFrameWork的一部分打毛,可以將整個(gè)項(xiàng)目Clone下來导坟,如果朋友們有需求咨油,我可以整理一個(gè)獨(dú)立的demo出來俭令。
WebSocket是html5帶來的一項(xiàng)重大的特性漆魔,使得瀏覽器與服務(wù)端之間真正長連接交互成為了可能粉洼,這篇文章會(huì)帶領(lǐng)大家窺探一下Spring 對(duì)WebSocket的支持及使用批糟。
基礎(chǔ)環(huán)境
快速搭建Spring框架,我們使用Spring boot矢炼,這里先不討論SpringBoot斤葱,只知道它是一個(gè)“快速搭建Spring項(xiàng)目的一站式解決方案”就OK了慷垮。
要使用Spring的WebSocket功能,我們需要添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
這樣就輕松開啟了WebSocket基礎(chǔ)功能揍堕。
相關(guān)配置
下面我們來配置WebSocket料身。
首先新增一個(gè)WebSocketConfig類,定義全局的配置信息衩茸,使用JavaConfig的形式:
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
相關(guān)說明:
-
registerStompEndpoints(StompEndpointRegistry registry)
這個(gè)方法的作用是添加一個(gè)服務(wù)端點(diǎn)芹血,來接收客戶端的連接。
-
registry.addEndpoint("/socket")
表示添加了一個(gè)/socket
端點(diǎn)楞慈,客戶端就可以通過這個(gè)端點(diǎn)來進(jìn)行連接幔烛。 -
withSockJS()
的作用是開啟SockJS支持,
-
configureMessageBroker(MessageBrokerRegistry config)
這個(gè)方法的作用是定義消息代理抖部,通俗一點(diǎn)講就是設(shè)置消息連接請(qǐng)求的各種規(guī)范信息说贝。
-
registry.enableSimpleBroker("/topic")
表示客戶端訂閱地址的前綴信息,也就是客戶端接收服務(wù)端消息的地址的前綴信息(比較繞慎颗,看完整個(gè)例子,大概就能明白了) -
registry.setApplicationDestinationPrefixes("/app")
指服務(wù)端接收地址的前綴言询,意思就是說客戶端給服務(wù)端發(fā)消息的地址的前綴
上面兩個(gè)方法定義的信息其實(shí)是相反的俯萎,一個(gè)定義了客戶端接收的地址前綴,一個(gè)定義了客戶端發(fā)送地址的前綴
到目前為止运杭,整個(gè)框架的配置信息已經(jīng)完成夫啊,下面我們來寫一個(gè)發(fā)送公告的例子,展示一下WebSocket的魅力辆憔!
編寫后臺(tái)業(yè)務(wù)
有了上述的基本配置信息撇眯,我們就可以編寫基本功能了报嵌。這里先簡單說明兩個(gè)知識(shí)點(diǎn):
- MessageMapping
Spring對(duì)于WebSocket封裝的特別簡單,提供了一個(gè)@MessageMapping
注解熊榛,功能類似@RequestMapping
锚国,它是存在于Controller
中的,定義一個(gè)消息的基本請(qǐng)求玄坦,功能也跟@RequestMapping
類似血筑,包括支持通配符``的url定義等等,詳細(xì)用法參見Annotation Message Handling - SimpMessagingTemplate
SimpMessagingTemplate
是Spring-WebSocket內(nèi)置的一個(gè)消息發(fā)送工具煎楣,可以將消息發(fā)送到指定的客戶端豺总。
下面我們來實(shí)現(xiàn):
新建一個(gè)GreetingController
,
@Controller
public class GreetingController {
@Resource
private SimpMessagingTemplate simpMessagingTemplate;
@RequestMapping("/helloSocket")
public String index(){
return "/hello/index";
}
@MessageMapping("/change-notice")
public void greeting(String value){
this.simpMessagingTemplate.convertAndSend("/topic/notice", value);
}
}
相關(guān)說明:
- index()
指定了一個(gè)頁面择懂,用來實(shí)現(xiàn)WebSocket客戶端發(fā)送公告功能喻喳,使用的是@RequestMapping
,所以接收的是http請(qǐng)求困曙,進(jìn)行頁面跳轉(zhuǎn)沸枯。 - greeting(String value)
這個(gè)方法是接收客戶端發(fā)送功公告的WebSocket請(qǐng)求,使用的是@MessageMapping
赂弓。 -
this.simpMessagingTemplate.convertAndSend("/topic/notice", value)
這個(gè)方法官方給出的解釋是Convert the given Object to serialized form, possibly using a MessageConverter, wrap it as a message and send it to the given destination.
意思就是“將給定的對(duì)象進(jìn)行序列化绑榴,使用‘MessageConverter’進(jìn)行包裝轉(zhuǎn)化成一條消息,發(fā)送到指定的目標(biāo)”盈魁,通俗點(diǎn)講就是我們使用這個(gè)方法進(jìn)行消息的轉(zhuǎn)發(fā)發(fā)送翔怎!
前面我們?nèi)峙渲弥兄付朔?wù)端接收的連接以 app
大頭,所以客戶端發(fā)送公告的請(qǐng)求連接應(yīng)該是/app/change-notice
杨耙。
服務(wù)端代碼就這么簡單赤套,跟寫SpringMVC類似,同樣上面的geeting(String value)
方法我們還可以使用另一個(gè)注解@SendTo
換成另一種寫法珊膜。
@MessageMapping("/change-notice")
@SendTo("/topic/notice")
public String greeting(String value) {
return value;
}
相關(guān)說明:
改進(jìn)后的代碼更簡單容握,著重理解一下@SendTo
。
-
@SendTo
定義了消息的目的地车柠。結(jié)合例子解釋就是“接收/app/change-notice
發(fā)來的value剔氏,然后將value轉(zhuǎn)發(fā)到/topic/notice
客戶端。 -
/topic/notice
是客戶端發(fā)起連接后竹祷,訂閱服務(wù)端消息時(shí)指定的一個(gè)地址谈跛,用于接收服務(wù)端的返回,后面我們?cè)趯懣蛻舳舜a的時(shí)候會(huì)看見塑陵。
到目前為止感憾,服務(wù)端代碼Coding完畢!下一篇文章我們來寫客戶端功能令花。