欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

程序员文章站 2022-05-24 18:33:56
一.概述 在asp.net core 中可以用WebSocket 或asp.net core SignalR来开发即时通迅。在项目中由于开发前后端分离,对于SignalR前端技术人员不想依赖juqery和SignalR.js包,后端确定使用WebSocket 来实现。对于asp.net core有自 ......

一.概述

  在asp.net core 中可以用websocket 或asp.net core signalr来开发即时通迅。在项目中由于开发前后端分离,对于signalr前端技术人员不想依赖juqery和signalr.js包,后端确定使用websocket 来实现。对于asp.net core有自带的app.usewebsockets()中间件,但是使用iis做为web代理服务器时,需要在windows系统添加程序iis配置websocket才能使用websocket通讯。于是项目引用了一个开源包fleck。

  fleck是对c#websocket的实现,程序内部使用了system.net.sockets类来实现websocket,不依赖于任何目标框架。 fleck使用介绍 :https://github.com/statianzo/fleck

  下面是msdn文档原话:

  对于大多数应用程序,我们建议使用 signalr,而不是原始 websocket。 signalr 可为 websocket 不可用的环境提供传输回退。 它还可提供简单的远程过程调用应用模型。 并且在大多数情况下,与使用原始 websocket 相比,signalr 没有显著的性能缺点。

 

  websocket客户端支持:

浏览器

支持情况

chrome

chrome version 4+支持

firefox

firefox version 5+支持

ie

ie version 10+支持

safari

ios 5+支持

android brower

android 4.5+支持

二.项目中即时通迅实现架构  

  在我业务项目中实现的流程是:第三方接口发送数据过来,使用redis进行发布消息, 在web端进行消息订阅, 把订阅的消息通过websocket发送到前端站点,前端界面进行局部数据刷新展示,已解决前端即时消息的展示。

asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

 三. 项目实现

  3.1相关包

    (1) 发布订阅redis包:install-package stackexchange.redis -version 2.0.601
    (2) websocket引用 fleck 包。install-package fleck -version 1.1.0

   3.2 fleck案例

     关于fleck的websocket的参考如下:https://github.com/statianzo/fleck/tree/master/src/samples/consoleapp

asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

  3.3 项目中演示效果

      (1) 使用web来做websocket宿主,websocket地址为:ws://127.0.0.1:8181,如下所示websocket服务已启动

        asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

 

      (2) 启动前端界面,下图可以看到websocket已连接

asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

         前端页面连接websocket服务关键代码: window.ws = new wsimpl('ws://127.0.0.1:8181',"footballgoalscore");   具体参考fleck的websocket示例。

 

      (3) 控制台程序使用redis模拟发布信息, web端redis订阅消息,再通过websocket服务推送消息到前端页面,通过下图可以看到消息已即时传到

asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅

        public void footballscore(iwebsocketconnection websocke)
        {
            //redis先订阅消息
            _subscriber.subscribe("queue2", (msg) =>
            {
                //websocket服务推送消息
                websocke.send(msg);
                _llogger.debug("消息已发送!");
            });
        

     下面是模拟第三方接口消息达到后,使用redis来发布消息,发布后web端redis自动订阅。

        static void main(string[] args)
        {
            isubscriber subscriber = new gfredissubscriber();
            //足球比分
            subscriber.publish("queue2", "1:0");
            //即时欧指
            subscriber.publish("queue1", "1.69|3.30|3.78");
            console.readline();
        }

 

 

  参考文献:

    asp.net core 中的 websocket 支持

    asp.net core signalr 简介

    websocket资料