作者:THOMAS KENDALL
轉載自公眾號:stackgc
在開發 Web 應用時,我們有時需要將服務端事件推送到連線的客戶端。但 HTTP 並不能做到:客戶端開啟與服務端的連線並請求資料,反之服務端無法實現。
為了突破這個限制,我們可以建立一個輪詢模式,網頁間隔輪詢伺服器以獲取新事件。但這種模式不太理想,因為它增加了 HTTP 開銷,速度也受輪詢速率影響,並且給伺服器增加了不必要的負載。
幸運的是,HTML5 WebSocket 出現了。WebSocket 協議允許瀏覽器與 Web 伺服器之間進行低開銷的互動。在文中,我們將介紹 Websockets API,並講解如何使用 Spring Boot 實現 Websocket。
HTML5 來救場!
WebSocket 通過瀏覽器和伺服器之間的單連線提供全雙工通訊。它不存在 HTTP 開銷,並且允許伺服器將訊息實時推送到客戶端。
WebSocket API 實際上很簡單。你只需要建立一個 WebSocket
物件,附加事件監聽器和傳送訊息即可。
以下是一個例子:
var socket = new WebSocket('ws://' + window.location.host + '/my-websocket-endpoint');
// 連結開啟的監聽事件
socket.onopen = function() {
console.log('WebSocket connection opened. Ready to send messages.');
// 傳送一條訊息到服務端
socket.send('Hello, from WebSocket client!');
};
// 接受到服務端訊息的監聽器
socket.onmessage = function(message) {
console.log('Message received from server: ' + message);
};
複製程式碼
Spring Boot
Spring 為 WebSocket 介面提供了很好的支援。
首先,我們需要建立一個類,繼承 Spring 的 TextWebSocketHandler
類。
public class MyMessageHandler extends TextWebSocketHandler {
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
// WebSocket 被關閉後觸發
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 新 WebSocket 建立連線觸發
// 可以儲存 session 物件來傳送訊息
// 傳送第一條訊息
session.sendMessage(new TextMessage("You are now connected to the server. This is the first message."));
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {
// 收到訊息觸發
System.out.println("Message received: " + textMessage.getPayload());
}
}
複製程式碼
接下來,我們需要配置 WebSocket 端點。
@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {
@Bean
public WebSocketHandler myMessageHandler() {
return new MyMessageHandler();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myMessageHandler(), "/my-websocket-endpoint");
}
}
複製程式碼
由於 WebSockets API 是純 JavaScript,你可以在大多數前端框架中使用它。包括 Angular,你可以在 TypeScript 中包含 JavaScript 程式碼。
總結
是不是相當簡單?它解決了服務端和客戶端之間傳輸資料的一大困擾。Spring Boot 使它變得更加簡單。