【转】使用websocket-sharp来创建c#版本的websocket服务
當(dāng)前有一個(gè)需求,需要網(wǎng)頁(yè)端調(diào)用掃描儀,javascript不具備調(diào)用能力,因此需要在機(jī)器上提供一個(gè)ws服務(wù)給前端網(wǎng)頁(yè)調(diào)用掃描儀。而掃描儀有一個(gè)c#版本的API,因此需要尋找一個(gè)c#的websocket庫(kù)。
java里有大名鼎鼎的netty,通過搜索,c#可以選擇websocket-sharp來實(shí)現(xiàn)websocket Server。
使用websocket-sharp創(chuàng)建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?兩個(gè)類需要引用?WebSocketSharp.Server?namespace.
Step 2#
編寫處理類,需要繼承?WebSocketBehavior?class.
例如,如果你要?jiǎng)?chuàng)建一個(gè)echo Service,
Copy
using System; using WebSocketSharp; using WebSocketSharp.Server; public class Echo : WebSocketBehavior { protected override void OnMessage (MessageEventArgs e) { Send (e.Data); } }
再提供一個(gè) 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)?方法, 來處理消息
同時(shí)你也可以重載?WebSocketBehavior.OnOpen (),?WebSocketBehavior.OnError (ErrorEventArgs), 和?WebSocketBehavior.OnClose (CloseEventArgs)?方法,來處理websocket連接事件。
通過WebSocketBehavior.Send?方法來給客戶端發(fā)送消息。
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#
創(chuàng)建?WebSocketServer?對(duì)象.
Copy
var wssv = new WebSocketServer (4649); wssv.AddWebSocketService<Echo> ("/Echo"); wssv.AddWebSocketService<Chat> ("/Chat"); wssv.AddWebSocketService<Chat> ("/ChatWithNyan", () => new Chat (" Nyan!"));
Step 4#
啟動(dòng) WebSocket server.
Copy
wssv.Start ();
Step 5#
停止 WebSocket server.
Copy
wssv.Stop (code, reason);
測(cè)試Demo#
目的:對(duì)外提供一個(gè)websocket服務(wù),讓網(wǎng)頁(yè)端的js可以調(diào)用掃描儀
服務(wù)端代碼#
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創(chuàng)建連接,支持?jǐn)嗑€重連
- 可以調(diào)用scan函數(shù),發(fā)送scan指令
作者: JadePeng
出處:https://www.cnblogs.com/xiaoqi/p/websocket-sharp.html
版權(quán):本文采用「署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際(歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接)?」知識(shí)共享許可協(xié)議進(jìn)行許可。
總結(jié)
以上是生活随笔為你收集整理的【转】使用websocket-sharp来创建c#版本的websocket服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一代回忆终结!IE今天正式退出历史舞台
- 下一篇: c# char unsigned_dll