Webapi实现websocket实时通讯

本文介绍了一种使用WebAPI实现WebSocket实时通讯的方法。后端通过监听端口获取数据,经过处理后通过WebSocket发送到前端。数据处理通过Datawatcher单例对象完成,其包含委托队列,允许外部注册和删除。WebSocket在WebAPI中的实现需要注意连接的保持和数据发送的处理。文章探讨了Controller的实例化、事件与委托的区别以及WebSocket中async Task使用死循环的原因,并提供了思路和代码参考。
摘要由CSDN通过智能技术生成

  应用场景:前端页面发起一个websocket请求与后端进行实时通讯。后端监听某端口获取数据,将监听到的数据加工处理,通过websocket发送到前端。

  这里只提供后台的处理方案仅供参考。
  1.后端监听某端口,获取数据并数据处理。可以在Global中单独开启一个后台线程用来监听数据。数据处理交给datawatcher的单例对象来处理。由于是监控端口的工作,一般采用独立线程在项目启动的时候就进行监听,因此可以将代码放在Application_start中。
  2.datawatcher对象,它需要有个委托队列,允许外部进行注册和删除。原理同事件类似,但是采用委托队列并将其暴露主要是为了容错,因为可能会用到删除委托队列中的委托。严谨的事务逻辑应该用事件(事件有点久了,忘了事件怎么写了)
  3.webapi建立websocket。

  以下为代码部分:

      protected void Application_Start()
        {
     //webapi相关配置
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
           //todo 初始化datawatcher 监听实时数据 
            //伪造实时数据
            Thread bgthread = new Thread(Start);
            bgthread.IsBackground = true;
            bgthread.Start();

        }
    //除红色部分均为模拟实时数据,正常数据应是通过监听获取
        private void Start()
        {
            Random r = new Random();
            var datawatcher = DataWatcher.GetInit();
            while (true)
            {
                dynamic dyobj = new ExpandoObject();
                dyobj.stationid = "01";
                dyobj.value = new { at = DateTime.Now.ToTimeStampMS(), value = (r.Next(0, 1024)) }.ToJson();
                datawatcher.Updata(dyobj, CallBackType.Record);
                Thread.Sleep(1000);
            }
        }
//使用单例是为了确保项目中使用的是同一个对象,防止注册的callback丢失
 public class DataWatcher
    {
        private static DataWatcher _dataWatcher;
        static readonly object locker = new object();

        private DataWatcher()
        {
            CallBackAlarms = new List<DynamicDelegate>();
            CallBackRecords = new List<DynamicDelegate>();
            CallBackSpes = new List<DynamicDelegate>();
        }

        public static DataWatcher GetInit()
        {
            if (_dataWatcher == null)
            {
                lock (locker)
                {
                    if (_dataWatcher == null)
                    {
                        _dataWatcher = new DataWatcher();
                    }
                }
            }
            return _dataWatcher;
        }

        public WebSocket WebSocket { get; set
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值