當前有一個需求,需要網頁端調用掃描儀,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指令