您好,登錄后才能下訂單哦!
在開發 Web 應用程序時,我們有時需要將服務端事件推送到連接的客戶端。但 HTTP 并不能做到。客戶端打開與服務端的連接并請求數據,但服務端不能打開與客戶端的連接并推送數據。
為了解決這個限制,我們可以建立了一個輪詢模式,網頁會間隔地輪詢服務器以獲取新事件。但這種模式不太理想,因為它增加了 HTTP 開銷,速度也只能達到與輪詢的速率一樣快,并且給服務器增加了不必要的負載。
幸運的是,HTML5 WebSocket 出現了。WebSocket 協議允許瀏覽器與 Web 服務器之間進行低開銷的交互。在文中,我們將介紹 Websockets API,并展示如何使用 Spring Boot 實現 Websockets。
HTML5 來救場!
WebSockets 通過瀏覽器和服務器之間的單連接提供全雙工通信。它不存在 HTTP 開銷,并且允許服務器將消息實時推送到客戶端。
WebSocket API 實際上很簡單。您只需要創建一個 WebSocket 對象,附加事件監聽器和發送消息即可。
以下是一個例子:
var socket = new WebSocket('ws://' + window.location.host + '/my-websocket-endpoint'); // Add an event listener for when a connection is open socket.onopen = function() { console.log('WebSocket connection opened. Ready to send messages.'); // Send a message to the server socket.send('Hello, from WebSocket client!'); }; // Add an event listener for when a message is received from the server socket.onmessage = function(message) { console.log('Message received from server: ' + message); };
Spring Boot
Spring 對 WebSockets 接口提供了很好的支持。
首先,我們需要創建一個類,繼承 Spring 的 TextWebSocketHandler
類。
public class MyMessageHandler extends TextWebSocketHandler { @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { // The WebSocket has been closed } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // The WebSocket has been opened // I might save this session object so that I can send messages to it outside of this method // Let's send the first message 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 { // A message has been received 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 使它變得更加簡單。
原文鏈接:https://keyholesoftware.com/2017/04/10/websockets-with-spring-boot/
作者:THOMAS KENDALL
譯者:oopsguy.com
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。