国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當(dāng)前位置:首頁 > 科技  > 軟件

SpringBoot整合WebSocket詳解

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

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

WebSocket介紹

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

WebSocket交互開始于一個(gè)HTTP請(qǐng)求,使用HTTP Upgrade header進(jìn)行升級(jí),在本例中是切換到WebSocket協(xié)議。下面的例子展示了這種交互:z9p28資訊網(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頭部信息z9p28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

HTTP與WebSocket

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

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

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

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

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

什么時(shí)候該使用WebSocket

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

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

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

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

WebSocket核心API

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

  • WebSocketHandler

創(chuàng)建WebSocket服務(wù)器很簡單,只需實(shí)現(xiàn)WebSocketHandler,或者擴(kuò)展TextWebSocketHandler或BinaryWebSocketHandler。下面的例子使用了TextWebSocketHandler:z9p28資訊網(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("服務(wù)端接收到消息 - " + message.getPayload())) ;    } catch (IOException e) {      e.printStackTrace();    }  }  @Override  public void afterConnectionEstablished(WebSocketSession session) throws Exception {    System.out.printf("連接成功, 會(huì)話Id: %s, Attribute: %s%n", session.getId(), session.getAttributes()) ;  }  @Override  public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {    System.out.printf("連接關(guān)閉, 會(huì)話Id: %s, 關(guān)閉狀態(tài): %s%n", session.getId(), status.getCode() + " - " + status.getReason()) ;  }}

WebSocket配置z9p28資訊網(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握手請(qǐng)求,最簡單的方法是使用HandshakeInterceptor,它提供了握手前和握手后的方法。你可以使用這樣的攔截器來阻止握手,或者讓 WebSocketSession可以訪問任何屬性。下面的例子使用內(nèi)置的攔截器將HTTP會(huì)話屬性傳遞給WebSocket會(huì)話:z9p28資訊網(wǎng)——每日最新資訊28at.com

@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry      .addHandler(messageHandler(), "/message")      .setHandshakeHandler(handshakeHandler())      // 添加捂手?jǐn)r截器      .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應(yīng)用程序中,DispatcherServlet可以同時(shí)處理HTTP WebSocket握手和其他HTTP請(qǐng)求。調(diào)用
WebSocketHttpRequestHandler也很容易集成到其他HTTP處理場景中。這樣既方便又容易理解。但是,對(duì)于JSR-356運(yùn)行時(shí),需要特別注意。z9p28資訊網(wǎng)——每日最新資訊28at.com

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

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

  • 服務(wù)配置

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

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

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


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

  • 允許的來源

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

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

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

測試

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

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

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

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


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

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


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

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

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

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

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
久久国产夜色精品鲁鲁99| 亚洲成在线观看| 欧美久久久久久久久久| 亚洲精选在线| 99精品视频免费观看| 亚洲乱码久久| 日韩午夜激情| 免费久久99精品国产自| 麻豆九一精品爱看视频在线观看免费| 国产亚洲第一区| 国产精品日韩一区二区| 国产伦精品一区二区三区| 国产精品久久久对白| 国产伦精品一区二区| 久久久国产亚洲精品| 色偷偷88欧美精品久久久| 欧美在线一二三| a美女胸又www黄视频久久| bt7086福利一区国产| 欧美理论在线| 亚洲精品九九| 日本乱人伦一区| 91麻豆精品国产无毒不卡在线观看| 欧美一区二区久久久| 精品日韩在线观看| 中文字幕日本不卡| 亚洲国产视频在线| 美女www一区二区| 国产成人在线电影| 欧美在线亚洲| 久久九九电影| 欧美精品一区二区三区在线| 国产精品免费人成网站| 亚洲一区av在线| 国产精品系列在线播放| 欧美日韩久久| 91福利精品第一导航| 久久综合色婷婷| 一区二区三区久久| 国产精品影视网| 亚洲精品美女91| 91精品国产综合久久福利软件| 中文字幕成人av| 免费亚洲电影在线| 欧美日韩久久| 欧美三级电影一区| 国产精品欧美久久久久无广告 | 国产精品国产精品国产专区不蜜 | 91尤物视频在线观看| 夜久久久久久| 欧美一区二区三区在线看| 国产精品日韩成人| 免费在线视频一区| 欧美日韩综合精品| 欧美色图激情小说| ...xxx性欧美| 国产成人在线电影| 久久久久久黄| 日本一区二区成人| 久久99热99| 国产精品乱码| 国产日韩影视精品| 韩国v欧美v日本v亚洲v| 91久久久久| 精品999久久久| 美腿丝袜亚洲一区| 国产日韩亚洲欧美精品| xnxx国产精品| 国产河南妇女毛片精品久久久| 国产一区白浆| 亚洲国产成人一区二区三区| 国产在线精品一区二区三区不卡| 国产精品亚洲综合| 国产精品国产三级国产普通话蜜臀 | 色综合中文字幕国产 | 国产精品久久久久一区| 成人黄色大片在线观看| 欧美色综合网站| 石原莉奈一区二区三区在线观看| 欧美视频一区| 日本一区二区三区高清不卡| 国产黄色成人av| 337p亚洲精品色噜噜噜| 午夜欧美电影在线观看| 中文精品视频| 亚洲精品久久久久久国产精华液| 欧美高清日韩| 欧美激情一区二区三区蜜桃视频 | 日韩视频永久免费| 国精产品一区一区三区mba桃花| 久久在线91| 视频在线观看国产精品| 亚洲一区二区在| 一区二区三区精品| 亚洲人成网站在线观看播放| 欧美国产综合色视频| 91在线观看污| 国产欧美一区二区精品仙草咪| 99精品热视频| 国产欧美日韩中文久久| 欧美精选在线| 成人免费一区二区三区在线观看 | 欧美激情综合网| 国产综合色一区二区三区| 国产日韩综合av| 亚洲国产毛片aaaaa无费看| 一区在线视频观看| 亚洲日本免费电影| 国产精品日韩| 天天综合色天天综合| 欧洲精品中文字幕| 久久66热re国产| 欧美成人r级一区二区三区| jizz一区二区| 亚洲欧美国产毛片在线| 久久av一区| 激情五月播播久久久精品| 欧美一区二区精美| 99久久婷婷国产| 亚洲四区在线观看| 色婷婷综合五月| 久久精品久久综合| 精品入口麻豆88视频| 国产一区二区中文字幕免费看| 一区二区在线观看免费| 色88888久久久久久影院野外| 国产久卡久卡久卡久卡视频精品| 久久色在线观看| 国产欧美欧美| 韩国v欧美v日本v亚洲v| 欧美国产国产综合| 久久精品女人天堂| 国产精品亚洲一区二区三区妖精| 欧美激情一区在线观看| 香蕉免费一区二区三区在线观看| 久久99精品国产.久久久久久| 久久视频一区二区| 另类激情亚洲| 成人激情开心网| 一区二区三区在线免费观看| 欧美日韩高清在线| 好看不卡的中文字幕| 蜜桃传媒麻豆第一区在线观看| 精品不卡在线视频| 久久国产直播| 91免费观看国产| 日韩国产欧美在线观看| 久久婷婷成人综合色| 欧美在线综合| 女人香蕉久久**毛片精品| 日日摸夜夜添夜夜添精品视频| 欧美成人性福生活免费看| 亚洲在线一区| 色综合天天综合色综合av | 国产精品一级片| 亚洲视频1区2区| 日韩精品一区二区三区四区| 国产亚洲一区在线播放| caoporen国产精品视频| 日韩激情视频在线观看| 国产精品视频在线看| 91精品国产综合久久久久久久久久| 伊人久久亚洲美女图片| 国产不卡在线一区| 日本欧美加勒比视频| 国产精品五月天| 欧美大片在线观看一区二区| 色综合久久精品| 伊人色综合久久天天五月婷| 成人小视频免费在线观看| 日韩国产精品久久久久久亚洲| 国产精品丝袜在线| 精品嫩草影院久久| 欧美在线一区二区三区| 亚洲欧美日韩国产一区二区| 欧美视频亚洲视频| av在线综合网| 国产成人免费在线视频| 九九九久久久精品| 视频一区欧美精品| 亚洲黄色小说网站| 中文字幕国产一区二区| 欧美videossexotv100| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美久久久久久| 波多野结衣欧美| 高清成人免费视频| 国产一区二区久久| 国产一区激情在线| 精品一二三四区| 久久99精品国产.久久久久久| 午夜电影久久久| 午夜av一区二区| 日韩av电影免费观看高清完整版 | 成人免费毛片嘿嘿连载视频| 国产综合成人久久大片91| 久久精品国产999大香线蕉| 图片区小说区区亚洲影院| 亚洲电影激情视频网站| 亚洲成人免费观看|