Spring WebSocket初探1 (Spring WebSocket入門教程)

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)說明:

  1. registerStompEndpoints(StompEndpointRegistry registry)
    這個(gè)方法的作用是添加一個(gè)服務(wù)端點(diǎn)芹血,來接收客戶端的連接。
  • registry.addEndpoint("/socket")表示添加了一個(gè)/socket端點(diǎn)楞慈,客戶端就可以通過這個(gè)端點(diǎn)來進(jìn)行連接幔烛。
  • withSockJS()的作用是開啟SockJS支持,
  1. 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):

  1. MessageMapping
    Spring對(duì)于WebSocket封裝的特別簡單,提供了一個(gè)@MessageMapping注解熊榛,功能類似@RequestMapping锚国,它是存在于Controller中的,定義一個(gè)消息的基本請(qǐng)求玄坦,功能也跟@RequestMapping類似血筑,包括支持通配符``的url定義等等,詳細(xì)用法參見Annotation Message Handling
  2. 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)說明:

  1. index()
    指定了一個(gè)頁面择懂,用來實(shí)現(xiàn)WebSocket客戶端發(fā)送公告功能喻喳,使用的是@RequestMapping,所以接收的是http請(qǐng)求困曙,進(jìn)行頁面跳轉(zhuǎn)沸枯。
  2. greeting(String value)
    這個(gè)方法是接收客戶端發(fā)送功公告的WebSocket請(qǐng)求,使用的是@MessageMapping赂弓。
  3. 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完畢!下一篇文章我們來寫客戶端功能令花。

傳送門:Spring WebSocket初探2 (Spring WebSocket入門教程)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阻桅,一起剝皮案震驚了整個(gè)濱河市凉倚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫂沉,老刑警劉巖稽寒,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異输瓜,居然都是意外死亡瓦胎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門尤揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搔啊,“玉大人,你說我怎么就攤上這事北戏「河螅” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵嗜愈,是天一觀的道長旧蛾。 經(jīng)常有香客問我,道長蠕嫁,這世上最難降的妖魔是什么锨天? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮剃毒,結(jié)果婚禮上病袄,老公的妹妹穿的比我還像新娘。我一直安慰自己赘阀,他們只是感情好益缠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著基公,像睡著了一般幅慌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轰豆,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天胰伍,我揣著相機(jī)與錄音,去河邊找鬼秒咨。 笑死喇辽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雨席。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吠式,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼陡厘!你這毒婦竟也來了抽米?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤糙置,失蹤者是張志新(化名)和其女友劉穎云茸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谤饭,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡标捺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揉抵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡容。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冤今,靈堂內(nèi)的尸體忽然破棺而出闺兢,到底是詐尸還是另有隱情,我是刑警寧澤戏罢,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布屋谭,位于F島的核電站,受9級(jí)特大地震影響龟糕,放射性物質(zhì)發(fā)生泄漏桐磁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一讲岁、第九天 我趴在偏房一處隱蔽的房頂上張望我擂。 院中可真熱鬧,春花似錦催首、人聲如沸扶踊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秧耗。三九已至,卻和暖如春舶治,著一層夾襖步出監(jiān)牢的瞬間分井,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工霉猛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尺锚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓惜浅,卻偏偏與公主長得像瘫辩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理伐厌,服務(wù)發(fā)現(xiàn)承绸,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,815評(píng)論 6 342
  • 今天中午在公司食堂吃過飯挣轨,為了避免長胖军熏,我便去附近的超市逛了逛。 在二樓超市里拿了一瓶水卷扮,轉(zhuǎn)身的時(shí)候荡澎,忽然看到前面...
    生命溫度加1閱讀 463評(píng)論 0 0
  • 個(gè)人介紹 李黎 國家二級(jí)心理咨詢師,婚姻家庭一級(jí)咨詢師晤锹,高級(jí)沙盤師摩幔,塔羅師。系統(tǒng)學(xué)習(xí)過感統(tǒng)訓(xùn)練抖甘,格式塔热鞍,房樹人繪畫...
    沐韻閣工作室閱讀 877評(píng)論 0 1
  • 昔人洛水躊躇夜薇宠,只悲歸時(shí)唯墳頭 凜凜刺骨寒風(fēng),你來時(shí)伴歲末飛雪艰额,水仙淺笑 暖暖懷中輕擁澄港,她泣時(shí)卻笑靨如花,梅滿枝頭...
    BINGLELOVING閱讀 342評(píng)論 3 4