应用场景:前端页面发起一个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