AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

SpringBoot整合WebSocket詳解

來源: 責編: 時間:2023-08-09 23:02:31 387觀看
導讀環(huán)境:Springboot3.0.5WebSocket介紹WebSocket協(xié)議RFC 6455提供了一種標準化的方式,通過一個TCP連接在客戶端和服務器之間建立全雙工、雙向的通信通道。它是一個不同于HTTP的TCP協(xié)議,但設(shè)計為在HTTP之上工作,使用80和443端

環(huán)境:Springboot3.0.5M8h28資訊網(wǎng)——每日最新資訊28at.com

WebSocket介紹

WebSocket協(xié)議RFC 6455提供了一種標準化的方式,通過一個TCP連接在客戶端和服務器之間建立全雙工、雙向的通信通道。它是一個不同于HTTP的TCP協(xié)議,但設(shè)計為在HTTP之上工作,使用80和443端口,并允許重用現(xiàn)有的防火墻規(guī)則。M8h28資訊網(wǎng)——每日最新資訊28at.com

WebSocket交互開始于一個HTTP請求,使用HTTP Upgrade header進行升級,在本例中是切換到WebSocket協(xié)議。下面的例子展示了這種交互:M8h28資訊網(wǎng)——每日最新資訊28at.com

GET /spring-websocket-portfolio/portfolio HTTP/1.1Host: localhost:8080Upgrade: websocket             // ①Connection: Upgrade           // ②Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==Sec-WebSocket-Protocol: v10.stomp, v11.stompSec-WebSocket-Version: 13Origin: http://localhost:8080

①:Upgrade header頭部信息M8h28資訊網(wǎng)——每日最新資訊28at.com

②:使用 Upgrade 連接M8h28資訊網(wǎng)——每日最新資訊28at.com

支持WebSocket的服務器會返回類似下面的輸出,而不是通常的200狀態(tài)碼:M8h28資訊網(wǎng)——每日最新資訊28at.com

HTTP/1.1 101 Switching Protocols Upgrade: websocketConnection: UpgradeSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=Sec-WebSocket-Protocol: v10.stomp

握手成功后,HTTP upgrade請求的TCP套接字保持打開,客戶端和服務器可以繼續(xù)發(fā)送和接收消息。M8h28資訊網(wǎng)——每日最新資訊28at.com

如果WebSocket服務器運行在web服務器(例如nginx)后面,你可能需要配置它來將WebSocket升級請求傳遞給WebSocket服務器。同樣,如果應用程序運行在云環(huán)境中,請查看云提供商提供的有關(guān)WebSocket支持的說明。M8h28資訊網(wǎng)——每日最新資訊28at.com

HTTP與WebSocket

盡管WebSocket在設(shè)計上是與HTTP兼容的,而且從HTTP請求開始,但重要的是要明白,這兩種協(xié)議導致了非常不同的架構(gòu)和應用程序編程模型。M8h28資訊網(wǎng)——每日最新資訊28at.com

在HTTP和REST中,應用程序被建模為多個url。為了與應用程序交互,客戶端以請求-響應的方式訪問這些url。服務器根據(jù)HTTP URL、方法和首部將請求路由到適當?shù)奶幚沓绦颉?span style="display:none">M8h28資訊網(wǎng)——每日最新資訊28at.com

相比之下,在websocket中,初始連接通常只有一個URL。隨后,所有應用程序消息都在同一個TCP連接上流動。這是一種完全不同的異步、事件驅(qū)動的消息傳遞架構(gòu)。M8h28資訊網(wǎng)——每日最新資訊28at.com

WebSocket也是一種底層傳輸協(xié)議,與HTTP不同,它對消息內(nèi)容沒有任何語義規(guī)定。這意味著除非客戶端和服務器在消息語義上達成一致,否則無法路由或處理消息。M8h28資訊網(wǎng)——每日最新資訊28at.com

WebSocket客戶端和服務器可以通過HTTP握手請求的Sec-WebSocket-Protocol頭部來協(xié)商使用更高級別的消息傳遞協(xié)議(例如STOMP)。在這種情況下,他們需要制定自己的慣例。M8h28資訊網(wǎng)——每日最新資訊28at.com

什么時候該使用WebSocket

WebSockets可以使網(wǎng)頁具有動態(tài)性和交互性。然而,在許多情況下,Ajax和HTTP流或長輪詢的組合可以提供簡單而有效的解決方案。M8h28資訊網(wǎng)——每日最新資訊28at.com

例如,新聞、郵件和社交源需要動態(tài)更新,但每隔幾分鐘更新一次完全沒問題。另一方面,協(xié)作、游戲和金融應用需要更接近實時。M8h28資訊網(wǎng)——每日最新資訊28at.com

延遲本身并不是決定性因素。如果消息量相對較少(例如監(jiān)視網(wǎng)絡故障),HTTP流或輪詢可以提供有效的解決方案。低延遲、高頻率和高容量的組合才是WebSocket的最佳選擇。M8h28資訊網(wǎng)——每日最新資訊28at.com

還要記住,在互聯(lián)網(wǎng)上,你無法控制的限制性代理可能會阻止WebSocket交互,要么是因為它們沒有配置為傳遞Upgrade header,要么是因為它們關(guān)閉了看起來空閑的長連接。這意味著對防火墻內(nèi)的內(nèi)部應用程序使用WebSocket比面向公眾的應用程序更直接。M8h28資訊網(wǎng)——每日最新資訊28at.com

WebSocket核心API

Spring框架提供了一個WebSocket API,可以用它來編寫處理WebSocket消息的客戶端和服務器端應用程序。M8h28資訊網(wǎng)——每日最新資訊28at.com

  • WebSocketHandler

創(chuàng)建WebSocket服務器很簡單,只需實現(xiàn)WebSocketHandler,或者擴展TextWebSocketHandler或BinaryWebSocketHandler。下面的例子使用了TextWebSocketHandler:M8h28資訊網(wǎng)——每日最新資訊28at.com

public class MessageHandler extends TextWebSocketHandler {  @Override  public void handleTextMessage(WebSocketSession session, TextMessage message) {    System.out.printf("SessionId: %s, 接收到消息: %s%n", session.getId(), message.getPayload()) ;    try {      session.sendMessage(new TextMessage("服務端接收到消息 - " + message.getPayload())) ;    } catch (IOException e) {      e.printStackTrace();    }  }  @Override  public void afterConnectionEstablished(WebSocketSession session) throws Exception {    System.out.printf("連接成功, 會話Id: %s, Attribute: %s%n", session.getId(), session.getAttributes()) ;  }  @Override  public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {    System.out.printf("連接關(guān)閉, 會話Id: %s, 關(guān)閉狀態(tài): %s%n", session.getId(), status.getCode() + " - " + status.getReason()) ;  }}

WebSocket配置M8h28資訊網(wǎng)——每日最新資訊28at.com

@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry.addHandler(messageHandler(), "/message")  }  @Bean  public WebSocketHandler messageHandler() {    return new MessageHandler();  }}
  • WebSocket Handshake

要定制初始的HTTP WebSocket握手請求,最簡單的方法是使用HandshakeInterceptor,它提供了握手前和握手后的方法。你可以使用這樣的攔截器來阻止握手,或者讓 WebSocketSession可以訪問任何屬性。下面的例子使用內(nèi)置的攔截器將HTTP會話屬性傳遞給WebSocket會話:M8h28資訊網(wǎng)——每日最新資訊28at.com

@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry      .addHandler(messageHandler(), "/message")      .setHandshakeHandler(handshakeHandler())      // 添加捂手攔截器      .addInterceptors(new HandshakeInterceptor() {        // 如果該方法返回false,則不允許建立連接        @Override        public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,            WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {          // todo          attributes.put("uid", uid) ;          return true ;        }        @Override        public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,            Exception exception) {          // todo        }      }) ;  }}
  • 部署

Spring WebSocket API很容易集成到Spring MVC應用程序中,DispatcherServlet可以同時處理HTTP WebSocket握手和其他HTTP請求。調(diào)用
WebSocketHttpRequestHandler也很容易集成到其他HTTP處理場景中。這樣既方便又容易理解。但是,對于JSR-356運行時,需要特別注意。M8h28資訊網(wǎng)——每日最新資訊28at.com

Java WebSocket API (JSR-356)提供兩種部署機制。第一種方法涉及啟動時的Servlet容器類路徑掃描(Servlet 3特性)@ServerEndpoint。另一個是Servlet容器初始化時使用的注冊 API(ServletContainerInitializer)。這兩種機制都不可能對所有HTTP處理使用單個“前端控制器”?—?包括WebSocket握手和所有其他HTTP請求?—?如Spring MVC的DispatcherServlet。M8h28資訊網(wǎng)——每日最新資訊28at.com

這是JSR-356的一個重要限制,Spring的WebSocket支持通過特定于服務器的RequestUpgradeStrategy實現(xiàn)來解決這個問題,即使運行在JSR-356運行時也是如此。Tomcat、Jetty、GlassFish、WebLogic、WebSphere和Undertow(以及WildFly)目前都存在這樣的策略。M8h28資訊網(wǎng)——每日最新資訊28at.com

  • 服務配置

每個底層WebSocket引擎都公開了控制運行時特征的配置屬性,例如消息緩沖區(qū)大小、空閑超時等。M8h28資訊網(wǎng)——每日最新資訊28at.com

對于Tomcat、WildFly和GlassFish,可以在WebSocket Java配置中添加
ServletServerContainerFactoryBean,如下面的例子所示:M8h28資訊網(wǎng)——每日最新資訊28at.com

@Beanpublic ServletServerContainerFactoryBean servletServerContainerFactoryBean() {  ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean() ;  container.setMaxTextMessageBufferSize(8192) ;  container.setMaxBinaryMessageBufferSize(8192) ;  return container ;}


M8h28資訊網(wǎng)——每日最新資訊28at.com

  • 允許的來源

從Spring Framework 4.1.5開始,WebSocket和SockJS的默認行為是只接受同源請求。也可以允許所有或指定的來源列表。這個檢查主要是為瀏覽器客戶端設(shè)計的。沒有什么能阻止其他類型的客戶端修改Origin首部值。M8h28資訊網(wǎng)——每日最新資訊28at.com

三種可能的行為是:M8h28資訊網(wǎng)——每日最新資訊28at.com

  1. 僅允許同源請求(默認):在這種模式下,當啟用SockJS時,Iframe HTTP響應頭X-Frame-Options設(shè)置為SAMEORIGIN,并且禁用JSONP傳輸,因為它不允許檢查請求的來源。因此,啟用此模式時,不支持IE6和IE7。
  2. 允許指定的來源列表:每個允許的來源必須以http://或https://.開頭在此模式下,當啟用SockJS時,禁用IFrame傳輸。因此,啟用此模式時,將不支持IE6到IE9。
  3. 允許所有來源:要啟用此模式,你應該提供*作為允許的來源值。在該模式下,所有傳輸通道都可用。
@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry      .addHandler(messageHandler(), "/message")      .setAllowedOriginPatterns("*") ;  }}

測試

通過上面的介紹和配置,WebSocket環(huán)境就算是簡單的配置完成了,接下來通過Postman進行測試。M8h28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片M8h28資訊網(wǎng)——每日最新資訊28at.com

連接成功M8h28資訊網(wǎng)——每日最新資訊28at.com

發(fā)送消息及接收消息發(fā)送消息及接收消息M8h28資訊網(wǎng)——每日最新資訊28at.com


M8h28資訊網(wǎng)——每日最新資訊28at.com

服務端接收到消息服務端接收到消息M8h28資訊網(wǎng)——每日最新資訊28at.com


M8h28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-5136-0.htmlSpringBoot整合WebSocket詳解

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 這款輕量級規(guī)則引擎,真香!

下一篇: 大模型速度狂飆2.39倍!清華聯(lián)手微軟首提SoT,讓LLM思考更像人類

標簽:
  • 熱門焦點
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產(chǎn)品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發(fā)布會上看到了iQOO的首款平板產(chǎn)品iQOO Pad。雖
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發(fā)仿造稿定設(shè)計的圖片編輯器到現(xiàn)在,不知不覺已過去一年時間了,期間我經(jīng)歷了裁員失業(yè)、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 電視息屏休眠仍有網(wǎng)絡上傳 愛奇藝被質(zhì)疑“薅消費者羊毛”

    記者丨寧曉敏 見習生丨汗青出品丨鰲頭財經(jīng)(theSankei) 前不久,愛奇藝發(fā)布了一份亮眼的一季報,不僅營收和會員營收創(chuàng)造歷史最佳表現(xiàn),其運營利潤也連續(xù)6個月實現(xiàn)增長。自去年年初
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現(xiàn)&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯(lián)發(fā)科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經(jīng)上市便受到了諸多用
Top