一站式做網(wǎng)站哪家強(qiáng)寧波網(wǎng)站推廣哪家公司好
大綱
- 最小可行案例
- 依賴
- 開啟Websocket,綁定路由
- 邏輯類
- 測(cè)試
- 參考資料
WebSocket是一種先進(jìn)的網(wǎng)絡(luò)通信協(xié)議,它允許在單個(gè)TCP連接上進(jìn)行全雙工通信,即數(shù)據(jù)可以在同一時(shí)間雙向流動(dòng)。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是一個(gè)無狀態(tài)的、請(qǐng)求-響應(yīng)模式的協(xié)議,它無法滿足實(shí)時(shí)、雙向通信的需求。WebSocket的出現(xiàn),解決了這一問題,它使得Web應(yīng)用能夠像桌面應(yīng)用一樣,實(shí)現(xiàn)低延遲、高頻率的數(shù)據(jù)交換。
WebSocket的核心特性包括:
- 全雙工通信:WebSocket允許客戶端和服務(wù)器之間進(jìn)行雙向通信,數(shù)據(jù)可以在同一時(shí)間雙向流動(dòng)。這意味著服務(wù)器可以主動(dòng)向客戶端推送數(shù)據(jù),而無需等待客戶端發(fā)起請(qǐng)求。
- 長連接:WebSocket連接一旦建立,就會(huì)保持打開狀態(tài),直到顯式關(guān)閉。這種長連接特性減少了頻繁建立和銷毀連接的開銷,提高了通信效率。
- 輕量級(jí)頭部:WebSocket數(shù)據(jù)幀采用緊湊的二進(jìn)制格式,減少了不必要的頭部信息,提高了數(shù)據(jù)傳輸效率。
- 實(shí)時(shí)性:由于數(shù)據(jù)可以直接在已建立的連接上傳輸,WebSocket能夠?qū)崿F(xiàn)實(shí)時(shí)或接近實(shí)時(shí)的數(shù)據(jù)交互。
- 跨域支持:與HTTP一樣,WebSocket也允許跨域通信,只需服務(wù)器端設(shè)置相應(yīng)的CORS(跨源資源共享)頭即可。
通過本系列學(xué)習(xí),我們會(huì)縮減《RabbitMQ實(shí)踐——搭建多人聊天服務(wù)》一文中的接口,在一個(gè)連接上實(shí)現(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 中的一個(gè)注解,它主要用于啟用對(duì) WebSocket 的支持。
我們通過WebSocketHandlerRegistry的addHandler方法,將/websocket接口的處理邏輯交由自定義的WebSocketHandler類處理;同時(shí)使用setAllowedOrigins來表示接受所有的域過來的請(qǐng)求。
邏輯類
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會(huì)被調(diào)用,我們將連接保存到sessions集合中。這一步主要是為了后續(xù)給各個(gè)連接發(fā)送請(qǐng)求用。
handleTextMessage表示收到了請(qǐng)求,然后會(huì)遍歷所有連接,并會(huì)對(duì)處于Open狀態(tài)的連接發(fā)送收到的消息。這兒就是收發(fā)放在一起了。
測(cè)試
我在網(wǎng)頁中用JS做了各種測(cè)試,會(huì)發(fā)現(xiàn)遇到很多問題。后來索性采用Postman來測(cè)試,親測(cè)可行且穩(wěn)定。
填入我們綁定的地址:ws://localhost:8080/websocket
下圖可見連接上了
我們發(fā)送一條hello
可以看到接受到了服務(wù)端的反饋
參考資料
- https://medium.com/@ropelife/real-time-communication-with-websocket-in-spring-boot-using-webflux-5d9fbb36a0ab