1.概述
在本文中,我們將使用新的Spring Framework 5 WebSockets API和Spring WebFlux Framework提供的響應功能來創建一個快速示例。
WebSocket是一種眾所周知的協議,它支持客戶端和伺服器之間的全雙工通信,通常用於Web應用程式中,其中客戶端和伺服器需要以高頻率和低延遲交換事件。
Spring Framework 5在框架中具有現代化的WebSockets支持,從而為該通信通道添加了響應功能。
我們可以在Spring WebFlux上找到更多信息。
2. Maven依賴
我們將使用開箱即用的spring-boot-starters依賴項來進行spring-boot-integration和spring-boot-starter-webflux(目前可在Spring Milestone Repository中獲得)。
在此示例中,我們使用的是最新的可用版本2.0.0.M7:
3. Spring中的WebSocket配置
我們的配置非常簡單:我們將注入WebSocketHandler來處理Spring WebSocket應用程式中的套接字會話。
此外,讓我們創建一個HandlerMapping bean注釋的方法,該方法將負責請求和處理程序對象之間的映射:
在這裡,我們可以看到可供使用的URL:ws:// localhost:<port> / event-emitter。
4. Spring中的WebSocket消息處理
我們的ReactiveWebSocketHandler類將負責管理伺服器端的WebSocket會話。
它實現了WebSocketHandler接口,因此我們可以覆蓋handle方法,該方法將用於將消息發送到WebSocket客戶端:
5.創建一個簡單的反應式WebSocket客戶端
現在,讓我們創建一個Spring Reactive WebSocket客戶端,它將能夠與我們的WebSocket伺服器連接並交換信息。
首先,Maven依賴項。
在這裡,我們使用與之前用於設置反應式WebSocket伺服器應用程式相同的spring-boot-starter-webflux。
現在,讓我們創建ReactiveClientWebSocket類,該類負責開始與伺服器的通信:
在上面的代碼中,我們可以看到我們正在使用ReactorNettyWebSocketClient,這是用於Reactor Netty 的WebSocketClient實現。
此外,客戶端通過URL ws:// localhost:8080 / event-emitter與WebSocket伺服器建立連接,並在連接到伺服器後立即建立會話。
我們還可以看到,我們正在與連接請求一起向伺服器發送一條消息(「 event-spring-reactive-client-websocket 」)。
此外,還會調用send方法,並希望使用Publisher <T>類型的變量作為參數,在我們的示例中,我們的Publisher <T>是Mono <T>,而T是簡單的String「 event-me-from-reactive- 「 java-client-websocket 」。
而且,調用了期望類型為String的Flux的thenMany(…)方法。的接收()方法獲得的傳入消息,後來被轉換成字符串的通量。
最後,block()方法強制客戶端在給定時間(在我們的示例中為10秒)之後與伺服器斷開連接。
要運行它,請確保Reactive WebSocket伺服器已啟動並正在運行。然後,啟動ReactiveJavaClientWebSocket類,我們可以在sysout日誌上看到正在發出的事件:
我們還可以從Reactive WebSocket伺服器的日誌中看到客戶端在嘗試連接期間發送的消息:
另外,我們可以在客戶端完成請求後(在我們的情況下,是10秒鐘後)看到終止連接的消息:
6.創建瀏覽器WebSocket客戶端
讓我們創建一個簡單的HTML / Javascript客戶端WebSocket來使用我們的響應式WebSocket伺服器應用程式。
在運行WebSocket伺服器的情況下,在瀏覽器(例如Chrome,Internet Explorer,Mozilla Firefox等)中打開此HTML文件,我們應該看到事件被列印在屏幕上,每個事件的延遲為1秒,如我們的WebSocket伺服器。
7.結論
在這裡,我們提供了一個示例,說明了如何通過使用Spring 5 Framework,實現Spring Webflux提供的新的響應功能來在伺服器和客戶端之間創建WebSocket通信。