【转】使用websocket-sharp来创建c#版本的websocket服务
當前有一個需求,需要網頁端調用掃描儀,javascript不具備調用能力,因此需要在機器上提供一個ws服務給前端網頁調用掃描儀。而掃描儀有一個c#版本的API,因此需要尋找一個c#的websocket庫。
java里有大名鼎鼎的netty,通過搜索,c#可以選擇websocket-sharp來實現websocket Server。
使用websocket-sharp創建websocket server####
Copy
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.
Copy
using WebSocketSharp.Server;
The?WebSocketBehavior?and?WebSocketServer?兩個類需要引用?WebSocketSharp.Server?namespace.
Step 2#
編寫處理類,需要繼承?WebSocketBehavior?class.
例如,如果你要創建一個echo Service,
Copy
using System; using WebSocketSharp; using WebSocketSharp.Server; public class Echo : WebSocketBehavior { protected override void OnMessage (MessageEventArgs e) { Send (e.Data); } }
再提供一個 chat service,
Copy
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?對象.
Copy
var wssv = new WebSocketServer (4649); wssv.AddWebSocketService<Echo> ("/Echo"); wssv.AddWebSocketService<Chat> ("/Chat"); wssv.AddWebSocketService<Chat> ("/ChatWithNyan", () => new Chat (" Nyan!"));
Step 4#
啟動 WebSocket server.
Copy
wssv.Start ();
Step 5#
停止 WebSocket server.
Copy
wssv.Stop (code, reason);
測試Demo#
目的:對外提供一個websocket服務,讓網頁端的js可以調用掃描儀
服務端代碼#
Copy
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代碼
Copy
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代碼
Copy
<button onclick="scan()">掃描</button>
- initWS創建連接,支持斷線重連
- 可以調用scan函數,發送scan指令
作者: JadePeng
出處:https://www.cnblogs.com/xiaoqi/p/websocket-sharp.html
版權:本文采用「署名-非商業性使用-相同方式共享 4.0 國際(歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接)?」知識共享許可協議進行許可。
總結
以上是生活随笔為你收集整理的【转】使用websocket-sharp来创建c#版本的websocket服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一代回忆终结!IE今天正式退出历史舞台
- 下一篇: A股“涨停王”众泰汽车浴火重生!募资60