一站式做網(wǎng)站哪家強寧波網(wǎng)站推廣哪家公司好
大綱
- 最小可行案例
- 依賴
- 開啟Websocket,綁定路由
- 邏輯類
- 測試
- 參考資料
WebSocket是一種先進(jìn)的網(wǎng)絡(luò)通信協(xié)議,它允許在單個TCP連接上進(jìn)行全雙工通信,即數(shù)據(jù)可以在同一時間雙向流動。WebSocket由IETF標(biāo)準(zhǔn)化為RFC 6455,并且已被W3C定義為JavaScript API的標(biāo)準(zhǔn),成為現(xiàn)代瀏覽器的重要特性之一。
WebSocket的引入徹底改變了傳統(tǒng)的Web應(yīng)用交互模式。在WebSocket之前,Web應(yīng)用通常使用HTTP協(xié)議進(jìn)行通信,但由于HTTP是一個無狀態(tài)的、請求-響應(yīng)模式的協(xié)議,它無法滿足實時、雙向通信的需求。WebSocket的出現(xiàn),解決了這一問題,它使得Web應(yīng)用能夠像桌面應(yīng)用一樣,實現(xiàn)低延遲、高頻率的數(shù)據(jù)交換。
WebSocket的核心特性包括:
- 全雙工通信:WebSocket允許客戶端和服務(wù)器之間進(jìn)行雙向通信,數(shù)據(jù)可以在同一時間雙向流動。這意味著服務(wù)器可以主動向客戶端推送數(shù)據(jù),而無需等待客戶端發(fā)起請求。
- 長連接:WebSocket連接一旦建立,就會保持打開狀態(tài),直到顯式關(guān)閉。這種長連接特性減少了頻繁建立和銷毀連接的開銷,提高了通信效率。
- 輕量級頭部:WebSocket數(shù)據(jù)幀采用緊湊的二進(jìn)制格式,減少了不必要的頭部信息,提高了數(shù)據(jù)傳輸效率。
- 實時性:由于數(shù)據(jù)可以直接在已建立的連接上傳輸,WebSocket能夠?qū)崿F(xiàn)實時或接近實時的數(shù)據(jù)交互。
- 跨域支持:與HTTP一樣,WebSocket也允許跨域通信,只需服務(wù)器端設(shè)置相應(yīng)的CORS(跨源資源共享)頭即可。
通過本系列學(xué)習(xí),我們會縮減《RabbitMQ實踐——搭建多人聊天服務(wù)》一文中的接口,在一個連接上實現(xiàn)消息的收發(fā)。
最小可行案例
依賴
在pom.xml中新增
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
開啟Websocket,綁定路由
src\main\java\com\nyctlc\front\config\WebSocketConfig.java
package com.nyctlc.front.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;import com.nyctlc.front.handler.WebSocketHandler;@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new WebSocketHandler(), "/websocket").setAllowedOrigins("*");}
}
@EnableWebSocket
是 Spring Boot 中的一個注解,它主要用于啟用對 WebSocket 的支持。
我們通過WebSocketHandlerRegistry的addHandler方法,將/websocket接口的處理邏輯交由自定義的WebSocketHandler類處理;同時使用setAllowedOrigins來表示接受所有的域過來的請求。
邏輯類
src\main\java\com\nyctlc\front\handler\WebSocketHandler.java
package com.nyctlc.front.handler;import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.HashSet;
import java.util.Set;public class WebSocketHandler extends TextWebSocketHandler {private static Set<WebSocketSession> sessions = new HashSet<>();@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {sessions.add(session);}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {for (WebSocketSession webSocketSession : sessions) {if (webSocketSession.isOpen()) {try {webSocketSession.sendMessage(message);} catch (IOException e) {e.printStackTrace();}}}}
}
當(dāng)連接建立后,afterConnectionEstablished會被調(diào)用,我們將連接保存到sessions集合中。這一步主要是為了后續(xù)給各個連接發(fā)送請求用。
handleTextMessage表示收到了請求,然后會遍歷所有連接,并會對處于Open狀態(tài)的連接發(fā)送收到的消息。這兒就是收發(fā)放在一起了。
測試
我在網(wǎng)頁中用JS做了各種測試,會發(fā)現(xiàn)遇到很多問題。后來索性采用Postman來測試,親測可行且穩(wěn)定。
填入我們綁定的地址:ws://localhost:8080/websocket
下圖可見連接上了
我們發(fā)送一條hello
可以看到接受到了服務(wù)端的反饋
參考資料
- https://medium.com/@ropelife/real-time-communication-with-websocket-in-spring-boot-using-webflux-5d9fbb36a0ab