當前有一個需求,需要網頁端調用掃描儀,javascript不具備調用能力,因此需要在機器上提供一個ws服務給前端網頁調用掃描儀。而掃描儀有一個c#版本的API,因此需要尋找一個c#的websocket庫。
java里有大名鼎鼎的netty,通過搜索,c#可以選擇websocket-sharp來實現websocket Server。
使用websocket-sharp創建websocket server
using System; using WebSocketSharp; using WebSocketSharp.Server; namespace Example { public class Laputa : WebSocketBehavior { protected override void OnMessage (MessageEventArgs e) { var msg = e.Data == "BALUS" ? "I've been balused already..." : "I'm not available now."; Send (msg); } } public class Program { public static void Main (string[] args) { var wssv = new WebSocketServer ("ws://dragonsnest.far"); wssv.AddWebSocketService<Laputa> ("/Laputa"); wssv.Start (); Console.ReadKey (true); wssv.Stop (); } } }
Step 1
Required namespace.
using WebSocketSharp.Server;
The WebSocketBehavior
and WebSocketServer
兩個類需要引用 WebSocketSharp.Server
namespace.
Step 2
編寫處理類,需要繼承 WebSocketBehavior
class.
例如,如果你要創建一個echo Service,
using System; using WebSocketSharp; using WebSocketSharp.Server; public class Echo : WebSocketBehavior { protected override void OnMessage (MessageEventArgs e) { Send (e.Data); } }
再提供一個 chat service,
using System; using WebSocketSharp; using WebSocketSharp.Server; public class Chat : WebSocketBehavior { private string _suffix; public Chat () : this (null) { } public Chat (string suffix) { _suffix = suffix ?? String.Empty; } protected override void OnMessage (MessageEventArgs e) { Sessions.Broadcast (e.Data + _suffix); } }
可以通過繼承WebSocketBehavior
類來自定義Service.
通過重載 WebSocketBehavior.OnMessage (MessageEventArgs)
方法, 來處理消息
同時你也可以重載 WebSocketBehavior.OnOpen ()
, WebSocketBehavior.OnError (ErrorEventArgs)
, 和 WebSocketBehavior.OnClose (CloseEventArgs)
方法,來處理websocket連接事件。
通過WebSocketBehavior.Send
方法來給客戶端發送消息。
If you would like to get the sessions in the service, you should access the WebSocketBehavior.Sessions
property (returns a WebSocketSharp.Server.WebSocketSessionManager
).
The WebSocketBehavior.Sessions.Broadcast
method can send data to every client in the service.
Step 3
創建 WebSocketServer
對象.
var wssv = new WebSocketServer (4649); wssv.AddWebSocketService<Echo> ("/Echo"); wssv.AddWebSocketService<Chat> ("/Chat"); wssv.AddWebSocketService<Chat> ("/ChatWithNyan", () => new Chat (" Nyan!"));
Step 4
啟動 WebSocket server.
wssv.Start ();
Step 5
停止 WebSocket server.
wssv.Stop (code, reason);
測試Demo
目的
:對外提供一個websocket服務,讓網頁端的js可以調用掃描儀
服務端代碼
class Program { static void Main(string[] args) { var wssv = new WebSocketServer(10086); wssv.AddWebSocketService<ScannerHandler>("/scan"); wssv.Start(); if (wssv.IsListening) { Console.WriteLine("Listening on port {0}, and providing WebSocket services:", wssv.Port); foreach (var path in wssv.WebSocketServices.Paths) Console.WriteLine("- {0}", path); } Console.WriteLine("\nPress Enter key to stop the server..."); Console.ReadLine(); wssv.Stop(); } } public class ScannerHandler : WebSocketBehavior { protected override void OnMessage(MessageEventArgs e) { if(e.Data == "scan") { ScanResult result = ScanerHelper.Scan("D:\\test.jpg"); if (result.Success) { Console.WriteLine("scan success"); Send("scan success"); } else { Send("scan eror"); } } } }
前端代碼
javascript代碼
var ws; function initWS() { ws = new WebSocket("ws://127.0.0.1:10086/scan"); ws.onopen = function () { console.log("Openened connection to websocket"); }; ws.onclose = function () { console.log("Close connection to websocket"); // 斷線重連 initWS(); } ws.onmessage = function (e) { alert(e.data) } } initWS(); function scan() { ws && ws.send('scan'); }
html代碼
<button onclick="scan()">掃描</button>
- initWS創建連接,支持斷線重連
- 可以調用scan函數,發送scan指令