有時候Server 需要與Client 建立長連線,例如廣播機制,這時websocket 可以嘗試看看。
websocket 它是一個全雙工的機制,且建立一次連線就會一直存在,除非 server 斷掉;
打算實作的情境呢,先建置一個 websocket server(先console 方便檢視),搭配一個簡易的網頁頁面,當作廣播中心,
主要是輸入一些文字,丟給 server 後幫我們廣播出去,其中被廣播的對象就是已經建立連線的使用者。
首先建立一個console 應用程式,使用WebSocketSharp-netstandard 這個套件,官網介紹的滿詳細的,除了基本設定,其中包含 ssl/tls、proxy、驗證都有,作者挺用心的,就決定是你了。
開始撰寫程式,先 using 一下相關命名空間
接著就是一串程式碼,後面分幾個步驟說明
Step1:
建立WebsocketServer 物件,並且指定13333 port 號(實務上local 端防火牆以及相關應用管道都需要知會開通)
Step2:
這邊等等後面再相關篇幅說明,可先看成加入相關自訂的動作或是行為到 Server
Step3:
啟動 server
Step4:
若已經有相關監聽時進入判斷式,印出監聽的port 號,以及對應的path
Step5:
印出告知使用者,若要停止服務只需要按一下鍵盤,後面就會呼叫 stop 函式停止。
接著來說明 Step2:
前面說到這是我們自訂的動作,也就是說,大部分訊息流通時都從這邊觸發,來看一下程式碼(其實這邊也是從官網來的)
我們建立 Laputa Class,並且繼承 WebSocketBehavior,記得要using WebSocketSharp 與WebSocketSharp.Server
其中我們 override OnMessage 方法,裡面設計當訊息成功傳到Server 的時候,
應該要作那些事情,這邊很簡單,若是成功建立第一次連線,console 會印出對應文字,
之後只要有文字進來只會單獨的印出;其中覆寫的方法還有一些,後續也會用到其中一個。
其中,e 物件,除了有Data 屬性之外,還提供 RawData 屬性是為二進制的值。
以上,到這邊Server 算是階段完成初版,先 Run 一下。
接下來建置一支網頁,只要是方便我們輸入一些文字,以下是介面設計
前端搭配vue 來協助介面操作,先來看個全貌,html 的部分我就不說明了
在 javascript 方面,最上面先宣告 websocket 變數,當頁面上點擊後會呼叫 _fnConnect 方法並進行相關設定。
Step1:
- 建立 websocket 物件,並且傳入uri
Step2:
- 設定 binaryType
Step3:
- 設定 onopen callback 事件,當建立連線時,使用 send 傳出訊息
Step4:
- 設計 opclose callback 事件
Step5:
- 設計 onerror callback 事件
Step6:
- 當畫面點選關閉時,websocket 呼叫 close 方法
跟來看一下實際操作,啟動 WebSocket Server(Console),再把網頁拉起來
接著調整一下Server 程式,模擬當訊息量稍微多一點化,可能需要搭配訊息(任務)佇列,這邊使用 .net 內建的ConcurrentQueue 類別以及獨體模式,讓應用程式只會有一個 Queue。
先建置任務物件 MessageQueueSingleton
接著調整Laputa 類別,override OnOpen,OnMessage 方法下將訊息加入 Queue
最後多加入一個頁面,一起來接收廣播的訊息
以上打好收工,程式碼參考連結
沒有留言:
張貼留言