自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

帶你了解一下WebSocket技術(shù)

開發(fā) 前端
在WebSocket規(guī)范提出之前,開發(fā)人員實現(xiàn)實時性較強的功能基本采用兩種輪詢方法:輪詢(polling)和Comet技術(shù)。

 在WebSocket規(guī)范提出之前,開發(fā)人員實現(xiàn)實時性較強的功能基本采用兩種輪詢方法:輪詢(polling)和Comet技術(shù)。

輪詢:輪詢技術(shù)要求客戶端以設(shè)定的時間間隔周期性地向服務(wù)端發(fā)送請求,頻繁地查詢是否有新的數(shù)據(jù)改動。明顯地,這種方法會導(dǎo)致過多不必要的請求,浪費流量和服務(wù)器資源。

Comet技術(shù)可分為:長輪詢、流技術(shù)。長輪詢改進了上述的輪詢技術(shù),減小了無用的請求。它會為某些數(shù)據(jù)設(shè)定過期時間,當數(shù)據(jù)過期后才會向服務(wù)端發(fā)送請求;這種機制適合數(shù)據(jù)的改動不是特別頻繁的情況。流技術(shù)**指客戶端使用一個隱藏的窗口與服務(wù)端建立HTTP長連接,服務(wù)端會不斷更新連接狀態(tài)以保持HTTP長連接存活,然后才能主動推送數(shù)據(jù)給客戶端。

缺點:這兩種技術(shù)每一次請求、應(yīng)答,都浪費了一定流量在相同的頭部信息上,并且開發(fā)復(fù)雜度也較大。

伴隨著HTML5推出的WebSocket,使B/S模式具備了C/S模式的實時通信能力。WebSocket連接本質(zhì)上是TCP連接,不需要每次傳輸都帶上重復(fù)的頭部數(shù)據(jù)。WebSocket的工作流程:瀏覽器通過JavaScript向服務(wù)端發(fā)出建立WebSocket連接的請求,在WebSocket連接建立成功后,客戶端和服務(wù)端就可以通過TCP連接傳輸數(shù)據(jù)。

WebSocket與TCP、HTTP的關(guān)系

WebSocket與http協(xié)議一樣都是基于TCP的可靠協(xié)議,WebSocket在建立握手連接時,數(shù)據(jù)是通過http協(xié)議傳輸?shù)?,但是在建立連接之后,真正的數(shù)據(jù)傳輸階段是不需要http協(xié)議參與的。


websocket通訊原理

從下圖可以明顯的看到,分三個階段:

  1. 打開握手
  2. 數(shù)據(jù)傳遞
  3. 關(guān)閉握手

下圖顯示了WebSocket主要的三步 瀏覽器和 服務(wù)器端分別做了那些事情。


websocket優(yōu)缺點

a)、服務(wù)器與客戶端之間交換的標頭信息很小,大概只有2字節(jié);

b)、客戶端與服務(wù)器可互相主動傳送數(shù)據(jù)給對方;

c)、Websocket是http協(xié)議的升級,支持持久連接并只需一次握手。不用頻率創(chuàng)建TCP請求及銷毀請求,減少網(wǎng)絡(luò)帶寬資源的占用,同時也節(jié)省服務(wù)器資源;

Spring boot websocket實現(xiàn)

引入依賴

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-websocket</artifactId> 
  4. </dependency> 

 創(chuàng)建 WebSocket 處理器

擴展 TextWebSocketHandler 或 BinaryWebSocketHandler ,你可以覆寫指定的方法。Spring 在收到 WebSocket 事件時,會自動調(diào)用事件對應(yīng)的方法。

  1. package com.ganhuojun.websocket.spring; 
  2.  
  3. import org.springframework.stereotype.Component; 
  4. import org.springframework.web.socket.CloseStatus; 
  5. import org.springframework.web.socket.WebSocketHandler; 
  6. import org.springframework.web.socket.WebSocketMessage; 
  7. import org.springframework.web.socket.WebSocketSession; 
  8.  
  9. @Component 
  10. public class MySpringWebSocketHandler implements WebSocketHandler { 
  11.  
  12.     /** 
  13.      * 建立連接后觸發(fā)的回調(diào) 
  14.      */ 
  15.     @Override 
  16.     public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception { 
  17.         System.out.println("spring 鏈接" + webSocketSession.getId()); 
  18.     } 
  19.  
  20.     /** 
  21.      * 收到消息時觸發(fā)的回調(diào) 
  22.      */ 
  23.     @Override 
  24.     public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception { 
  25.  
  26.     } 
  27.  
  28.     /** 
  29.      * 傳輸消息出錯時觸發(fā)的回調(diào) 
  30.      */ 
  31.     @Override 
  32.     public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception { 
  33.  
  34.     } 
  35.  
  36.     /** 
  37.      * 斷開連接后觸發(fā)的回調(diào) 
  38.      */ 
  39.     @Override 
  40.     public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception { 
  41.  
  42.     } 
  43.  
  44.     /** 
  45.      * 是否處理分片消息 
  46.      */ 
  47.     @Override 
  48.     public boolean supportsPartialMessages() { 
  49.         return false
  50.     } 

 配置 WebSocket

將 WebSocket 處理器添加到注冊中心

  1. package com.ganhuojun.websocket.spring; 
  2.  
  3. import org.springframework.context.annotation.Bean; 
  4. import org.springframework.context.annotation.Configuration; 
  5. import org.springframework.web.socket.config.annotation.EnableWebSocket; 
  6. import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 
  7. import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 
  8.  
  9. @Configuration 
  10. @EnableWebSocket 
  11. public class SpringWebSocketConfig implements WebSocketConfigurer { 
  12.  
  13.     @Override 
  14.     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
  15.         //spring默認會給一個OriginHandshakeInterceptor的攔截器 
  16.         // 因此需要setAllowedOrigins,否則websocket返回403 
  17.         registry.addHandler(springWebSocketHandler(), "/spring/websocket").setAllowedOrigins("*"); 
  18.     } 
  19.  
  20.     @Bean 
  21.     public MySpringWebSocketHandler springWebSocketHandler() { 
  22.         return new MySpringWebSocketHandler(); 
  23.     } 
  24.  

 前端可以自己編寫js代碼,本文直接使用websocket在線調(diào)試工具

http://www.websocket-test.com/

如下圖,

 

根據(jù)前面后端代碼,測試一下

 

后端日志


 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2020-02-10 14:26:10

GitHub代碼倉庫

2022-03-07 06:34:22

CQRS數(shù)據(jù)庫數(shù)據(jù)模型

2022-07-20 08:55:02

區(qū)塊鏈技術(shù)數(shù)據(jù)記錄

2021-11-09 08:57:13

元宇宙VR平行時空

2022-03-24 13:36:18

Java悲觀鎖樂觀鎖

2018-06-05 17:40:36

人工智能語音識別

2024-04-11 12:19:01

Rust數(shù)據(jù)類型

2019-02-20 14:16:43

2018-07-17 14:42:50

2023-11-18 09:09:08

GNUBSD協(xié)議

2024-02-28 18:22:13

AI處理器

2020-03-01 17:53:38

Excel大數(shù)據(jù)微軟

2025-01-26 08:00:00

遠程喚醒技術(shù)WOL網(wǎng)卡

2025-01-10 11:07:28

2019-08-07 15:42:14

區(qū)塊鏈區(qū)塊鏈技術(shù)開發(fā)言語

2019-03-11 14:33:21

Redis內(nèi)存模型數(shù)據(jù)庫

2018-08-08 09:30:29

服務(wù)器知識Linux系統(tǒng)

2024-04-26 08:41:04

ViteHMR項目

2020-12-21 05:56:54

Clipboard A復(fù)制圖像開發(fā)技術(shù)

2023-03-02 08:00:55

包管理工具pnpm 包
點贊
收藏

51CTO技術(shù)棧公眾號