• 使用websocket-sharp来创建c#版本的websocket服务


    当前有一个需求,需要网页端调用扫描仪,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("
    Press 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指令
  • 相关阅读:
    POI_Excel表格数据导入导出实例--支持xls/xlsx格式
    js图片压缩工具---base64码上传插件,兼容h5和微信端(lrz.mobile.min.js)
    同一个页面,加载不同版本jQuery
    This method isn't transactional
    jquery.cookie的使用,记住用户名
    正则表达式 2017/6/12
    kSet 2017/6/6
    差分与二维差分
    求组合数
    高精度
  • 原文地址:https://www.cnblogs.com/yanglang/p/9695857.html
Copyright © 2020-2023  润新知