當前有一個需求,需要網(wǎng)頁端調(diào)用掃描儀,javascript不具備調(diào)用能力,因此需要在機器上提供一個ws服務給前端網(wǎng)頁調(diào)用掃描儀。而掃描儀有一個c#版本的API,因此需要尋找一個c#的websocket庫。

java里有大名鼎鼎的netty,通過搜索,c#可以選擇websocket-sharp來實現(xiàn)websocket Server。

使用websocket-sharp創(chuàng)建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.

例如,如果你要創(chuàng)建一個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 方法來給客戶端發(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 對象.

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服務,讓網(wǎng)頁端的js可以調(diào)用掃描儀

服務端代碼

 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創(chuàng)建連接,支持斷線重連

  • 可以調(diào)用scan函數(shù),發(fā)送scan指令

http://www.cnblogs.com/xiaoqi/p/websocket-sharp.html