摘要:子協議只是一個消息傳遞的體系結構,沒有指定任何的消息傳遞協議。是一個簡單的消息傳遞協議,是一種為,面向消息的中間件設計的簡單文本協議。的實現對內嵌的或者和使用了提供了支持。廣播式廣播式即服務端有消息時,會將消息發送到所有連接了當前的瀏覽器。
簡單介紹
WebSocket是為瀏覽器和服務端提供雙工藝部通信功能一種工具,即瀏覽器可以先服務端發送消息,服務端也可以先瀏覽器發送消息。現在支持Websocket的瀏覽器有 IE10+,Crome13+,FileFox6+。
WebSocket子協議WebSocket只是一個消息傳遞的體系結構,沒有指定任何的消息傳遞協議。與HTTP協議不同的是,WebSocket只是一個應用層的協議,它非常簡單,并不能理解傳入的消息,也不能對消息進行路由或處理,因此WebSocket協議只是一個應用層的協議,其上需要一個框架來理解和處理消息。
Spring框架提供了對使用STOMP子協議的支持。STOMP,全稱Streaming Text Orientated Message Protol,流文本定向協議。STOMP是一個簡單的消息傳遞協議,是一種為MOM(Message Orientated Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提供了一個可操作的連接格式,允許STOMP客戶端與任意代理(Broker)進行交互,類似于OpenWire(一種二進制協議)。
Spring Boot的WebSocket實現
SpringBoot對內嵌的Tomcat(7或者8)、Jetty9和Undertow使用了WebSocket提供了支持。
廣播式廣播式即服務端有消息時,會將消息發送到所有連接了當前endpoint的瀏覽器。
配置WebSocket需要在配置類上使用@EnableWebSocketMessageBroker開啟WebSocket支持,并通過集成AbstractWebSocketMessageBrokerConfigurer類,重寫其方法來配置WebSocket。
package com.example.config; 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; /** * Created by lenovo on 2017/3/15. */ @Configuration @EnableWebSocketMessageBroker //通過@EnableWebSocketMessageBroker 注解凱旗使用STOMP協議來傳輸基于代理(message broker)的消息 //這時控制器支持使用@MessageMapping,就像使用@RequestMapping一樣 public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{ @Override public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) { stompEndpointRegistry.addEndpoint("/endpoint").withSockJS();//注冊STOMP協議的節點,映射指定的URL,并指定使用SockJS協議 } @Override public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代碼(Message Broker) registry.enableSimpleBroker("/topic");//廣播式應配置一個/topic消息代理 } }
消息的接收器、發送器和控制器
package com.example.model; /** * Created by lenovo on 2017/3/15. */ public class MessageSender { private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public MessageSender(String msg) { this.msg = msg; } }
package com.example.model; import java.io.Serializable; /** * Created by lenovo on 2017/3/15. */ public class MessageAcceptor implements Serializable{ private String msg; public String getMsg() { return msg; } }
package com.example.websocket; import com.example.model.MessageAcceptor; import com.example.model.MessageSender; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * Created by lenovo on 2017/3/15. */ @Controller public class TestWeb { @MessageMapping(value = "/message/test")//當瀏覽器向服務端發送請求時,通過@MessageMapping映射的地址,類似于@RequestMapping @SendTo(value = "/topic/response")//當服務端有消息時,會對訂閱了@SendTo中的路徑的瀏覽器發送消息 public MessageSender say(MessageAcceptor acceptor){ return new MessageSender("HELLO!"+acceptor.getMsg()); } @RequestMapping("index") public String index(){ return "index"; } }準備 WebSocket需要的前端文件。
下載stomp.min.js和sockjs.min.js文件,并放在static下,然后在templates下新建index.html頁面
stomp的API參考鏈接:https://segmentfault.com/a/11...
上述代碼都已經準備好了,那么一起來看一看運行效果Title
如預期一樣,在連接了WebSocket的客戶端發送消息時,其它同樣連接了WebSocket的客戶端瀏覽器也收到了消息,沒有連接WebSocket的客戶端則沒有收到消息
看完了代碼和代碼的運行效果,我們再來看一看WebSocket運行中STOMP的幀連接STOMP服務端幀:CONNECT?accept-version:1.1,1.0?heart-beat:10000,10000 連接STOMP服務端成功幀:CONNECTED?version:1.1?heart-beat:0,0 訂閱目標/topic/response:SUBSCRIBE?id:sub-0?destination:/topic/response 向目標/message/test發送消息:SEND?destination:/message/test?content-length:16??{"msg":"測試"} 從目標/topic/response接收到消息:MESSAGE?destination:/topic/response?content-type:application/json;charset=UTF-8?subscription:sub-0?message-id:hstpp2xl-0?content-length:22??{"msg":"HELLO!測試"}點對點式
廣播式有自己的應用場景,但是廣播式不能解決我們我們一個常見的問題,即消息由誰發送,由誰接受的問題。
1.在進行點對點傳遞消息的時候,必然發生在兩個用戶之間的行為,那么就需要添加用戶相關的內容,在這里先完成一個簡單的登陸。
首先添加Spring Security的starter pom:
org.springframework.boot spring-boot-starter-security
2.然后進行spring security的簡單配置
package com.example.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * Created by lenovo on 2017/3/17. */ @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { /** * 權限管理配置構造器 * * @param auth 權限管理 * @throws Exception */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //配置了兩個用戶和對應的密碼,并且申明了他們的角色 auth.inMemoryAuthentication().withUser("muxiao").password("123456").roles("USER") .and().withUser("hahaha").password("123456").roles("USER");//在內存中分別配置兩個用戶muxiao和hahaha } /** * Web安全配置 * @param web * @throws Exception */ @Override public void configure(WebSecurity web) throws Exception { //靜態資源不做安全校驗 web.ignoring().antMatchers("/resources/static/**");///resources/static/目錄下的靜態資源,不攔截 } /** * 配置http安全 * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { //簡單的配置運行點對點所需要的登陸權限 http.authorizeRequests() .antMatchers("/","login").permitAll()//設置Spring Security對/和/login路徑不攔截 .anyRequest().authenticated() .and().formLogin().loginPage("/login")//設置登錄頁面訪問的路徑為/login .defaultSuccessUrl("/chat").permitAll()//登陸成功后轉向chat頁面 .and().logout().permitAll(); } } 然后在TestWeb中增加一個MessageMapping接口: @Autowired private SimpMessagingTemplate messagingTemplate;//spring實現的一個發送模板類 @MessageMapping("/chat") public void handlerChat(Principal principal, String msg) {//springmvc中可以直接在參數中獲得pricipal,pricipal中包含當前永不的信息 if (principal.getName().equalsIgnoreCase("muxiao")) { messagingTemplate.convertAndSendToUser("hahaha","/queue/notice",principal.getName()+":"+msg); } else { messagingTemplate.convertAndSendToUser("muxiao","/queue/notice",principal.getName()+":"+msg); //通過messaginTemplate.converAndSendTiUser向用戶發送消息,第一次參數是接受信息的用戶,第二個是瀏覽器訂閱的地址,第三個是消息本身 } }
3.同時定義需要的頁面訪問路徑:
package com.example.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Created by lenovo on 2017/3/17. */ @Configuration public class WebViewConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/chat").setViewName("/chat"); registry.addViewController("/login").setViewName("/login"); } }
4.我們已經準備好了所需要的后臺,這時候就開始實現我們需要的功能的前端編寫了。
首先,實現登陸頁面,在瀏覽器中訪問除過"/","/index"之外的其它頁面,都會來到login頁面以進行登陸,即下面的頁面:
輸入我們在內存中指定的用戶名和密碼,登陸進入chat頁面Title
同時在兩個瀏覽器上面,用在內存中指定的兩個用戶登陸,這樣兩個用戶就可以互相發送消息了,延時效果如下:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68034.html
摘要:作為微服務的基礎設施之一,背靠強大的生態社區,支撐技術體系。微服務實踐為系列講座,專題直播節,時長高達小時,包括目前最流行技術,深入源碼分析,授人以漁的方式,幫助初學者深入淺出地掌握,為高階從業人員拋磚引玉。 簡介 目前業界最流行的微服務架構正在或者已被各種規模的互聯網公司廣泛接受和認可,業已成為互聯網開發人員必備技術。無論是互聯網、云計算還是大數據,Java平臺已成為全棧的生態體系,...
摘要:使用則需要及以上版本。開發使用框架七系列教程目錄系列教程大綱快速入門實踐實踐整合整合中和實踐整合中實現緩存中實現通信集成測試及部署實戰圖書管理系統 WebFlux 系列教程大綱 一、背景 大家都知道,Spring Framework 是 Java/Spring 應用程序跨平臺開發框架,也是 Java EE(Java Enterprise Edition) 輕量級框架,其 Spring ...
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:子協議只是一個消息傳遞的體系結構,沒有指定任何的消息傳遞協議。是一個簡單的消息傳遞協議,是一種為,面向消息的中間件設計的簡單文本協議。的實現對內嵌的或者和使用了提供了支持。廣播式廣播式即服務端有消息時,會將消息發送到所有連接了當前的瀏覽器。 簡單介紹 WebSocket是為瀏覽器和服務端提供雙工藝部通信功能一種工具,即瀏覽器可以先服務端發送消息,服務端也可以先瀏覽器發送消息。現...
閱讀 819·2021-10-25 09:48
閱讀 611·2021-08-23 09:45
閱讀 2496·2019-08-30 15:53
閱讀 1759·2019-08-30 12:45
閱讀 586·2019-08-29 17:21
閱讀 3407·2019-08-27 10:56
閱讀 2547·2019-08-26 13:48
閱讀 691·2019-08-26 12:24