专栏首页JadePeng的技术博客使用websocket-sharp来创建c#版本的websocket服务

使用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("\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指令

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员主管之路(1)

    作为码农,技术出生,随着能力的被认可,会逐步承担管理角色,但是在担任主管尝尝会遇到不少挑战,如何快速从一名个人贡献者转变为一名合格的团队领导,完成职责的华丽转身...

    用户1177380
  • axios介绍与使用说明 axios中文文档

    本周在做一个使用vuejs的前端项目,访问后端服务使用axios库,这里对照官方文档,简单记录下,也方便大家参考。 Axios 是一个基于 Promise 的 ...

    用户1177380
  • ASP.NET MVC 开源项目Kigg解读(1)

    Kigg是一个很好的ASP.NET MVC范例项目,本着研究的目的,对Kigg进行解读。 ASP.NET MVC Linq To SQL MS Patter...

    用户1177380
  • 小朋友学C++(17):析构函数

    析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” ...

    海天一树
  • (修订)双非渣本的我是如何进入京东(万字面经)

    楼楼双非渣本,实习的机会没有好好珍惜,一心想着考研,后来因为种种原因在暑假的时候又放弃考研,此时已经接近9月,大部分互联网公司的提前批秋招已经结束,对我这个笔试...

    乔戈里
  • OAuth2.0系列(一),什么是OAuth2.0,我们可以用他干什么?他和单点登录的区别是什么?

    他就是一个协议,就是一个标准,和我们之前知道的http是一样的。我们可以根据这个协议实现授权的功能。 总之一句话,就是用户根据这个协议进行授权,然后用这个协议...

    一天不写程序难受
  • Flink,Storm,SparkStreaming性能对比

    Yahoo 的 Storm 团队曾发表了一篇博客文章 ,并在其中展示了 Storm、Flink 和 Spark Streaming 的性能测试结果。该测试对于...

    用户6070864
  • 学好 MP4,让直播更给力

    villainhr
  • Flink,Storm,SparkStreaming性能对比

    该应用程序从 Kafka 消费广告曝光消息,从 Redis 查找每个广告对应的广 告宣传活动,并按照广告宣传活动分组,以 10 秒为窗口计算广告浏览量。 10 ...

    实时计算
  • 关于张量的Flatten、Reshape和Squeeze的解释 | Pytorch系列(六)

    欢迎回到这个关于神经网络编程的系列。从本系列的这篇文章开始,我们将开始使用到目前为止我们学到的关于张量的知识,并开始学习神经网络和深度学习的基本张量运算。

    AI算法与图像处理

扫码关注云+社区

领取腾讯云代金券