Web 實時通信,SignalR 真香,不用愁了

前言

對於 B/S 模式的項目,基礎的場景都是客戶端發起請求,服務端返回響應結果就結束了一次連接;但在很多實際應用場景中,這種簡單的請求和響應模式就顯得很喫力,比如消息通知、監控看板信息自動刷新等實時通信場景,小夥伴們肯定會想到輪詢或 WebSocket 的方式來搞定,可是單純用輪詢的方式有點耗資源,只用 WebSocket 的方式又有些瀏覽器或其他客戶端不支持,所以如果自己從頭來寫的話,很多細節還得做處理;這個時候 SignalR 就該站出來了,封裝的很給力,直接使用就行。

正文

1. SignalR 簡介

SignalR 是一個開源的庫,跨平臺;讓 Web 應用與其他應用通訊變得很簡單,Web 服務端可以實時的將內容推送給對應的客戶端,客戶端發送的信息也可以實時到其他客戶端

SignalR 提供了一種遠程過程調用 (RPC) 的方式,使得客戶端可以調用服務器的方法,同樣在服務器端的方法中也能調用客戶端的方法

1.1 SignalR 的通信方式

SignalR 支持如下的方式實現實時通信:

SignalR 會自動選擇服務器和客戶端能力範圍內的最佳通信方式 (是不是很優秀) ,當然也可以手動指定。

1.2 SignalR 的應用場景

其實對於 Web 模式下的實時通信,SignalR 用上試試,感覺還是很給力的。

理論大概先說這麼多,接下來就用實例演示一波。

2. 案例演示

2.1 SignalR 服務端

這裏我把 SignalR 的服務端寄宿在 WebAPI 項目中了,實際可以根據需要寄宿到對應的項目 (窗體應用、後臺服務),當然也可以單獨爲其創建一個項目,但代碼編寫都基本一樣。

2.2 JS 客戶端

Js 客戶端使用 Vue 組件,綁定數據方便;放在 WebApi 項目的 wwwroot 目錄下,和 WebAPI 一起共用服務器啓動,所以就不用考慮跨域問題。如果前端分開部署,需要在 SignalR 寄宿的項目中配置跨域。具體步驟如下:

2.3 WinForm 客戶端

佈局很簡單,在窗體中直接搞個文本框顯示消息就行;小夥伴們別嫌棄啊,主要體現的是流程,界面美化小夥伴們自己想怎麼搞都行。

核心代碼如下:

客戶端又很輕鬆的搞定了,運行起來看看效果:

先把服務器運行起來 (這裏是 WebApi 項目),然後窗體程序運行起來:

實現起來是不是很給力,現在不用再苦惱對於 B/S 模式下,服務器端主動的場景了吧;

2.4 客戶端主動上報數據信息,實時顯示到其他客戶端

上面的推送場景是服務端主動, 但有很多場景是客戶端主動上報數據,需要實時顯示到數據看板或顯示到其他客戶端界面。比如一些監控系統,需要實時顯示設備狀態;再比如類似遊戲的場景,其中一個客戶端發生改變,需要實時顯示到其他客戶端。

對應客戶端主動上報的場景,需要通過服務器轉發,因爲客戶端之間沒有建立連接,只有服務器知道有多少客戶端已連上,所以這個時候需要在服務端上增加一個方法供客戶端調用,如下步驟:

2.5 小結

上面列舉了兩個場景,服務器主動推和客戶端主動推兩種情況,基本上可以滿足大多數實時需求。通信流程圖如下:

案例源碼地址:https://gitee.com/CodeZoe/dot-net-core-study-demo/tree/main/SignalRDemo

總結

關於 SignalR 的簡單使用先說這麼多,便捷又好用;還有一些關鍵的知識點後續會分享,比如針對分組和用戶發信息、添加認證管理等,關注 “Code 綜藝圈”,和我一起學習吧;

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/La_H_Vc_duCggkyHZT3qTA