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

本文详细介绍了在ASP.NET Core项目中使用WebSocket和Fleck库进行即时通讯的实现过程。包括前后端分离环境下WebSocket的选择,Fleck库的使用,以及与Redis结合实现消息发布订阅的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.概述

  在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使用介绍 :GitHub - statianzo/Fleck: C# Websocket Implementation

  下面是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发送到前端站点,前端界面进行局部数据刷新展示,已解决前端即时消息的展示。

 三. 项目实现

  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

  3.3 项目中演示效果

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

        

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

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

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

        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资料

### WebSocket 结合 Redis 实现发布订阅模型 Redis 提供了一种高效的发布/订阅机制,能够用于实时通信场景。结合 WebSocket 技术,可以构建即时通讯系统,例如聊天室、在线通知等功能。 以下是使用 WebSocketRedis 发布/订阅模式的一个完整示例: #### 1. 使用 Redis 进行消息广播 Redis 的 `PUBLISH` 命令允许向指定频道发送消息,而客户端可以通过 `SUBSCRIBE` 订阅这些频道并接收消息[^4]。 #### 2. 配置 RedisTemplate 并发送消息 在 Java 中,可以借助 Spring Data Redis 提供的 `RedisTemplate` 来完成消息的发布工作。下面是一段代码示例,展示如何通过 Redis 向特定用户推送消息[^2]: ```java import org.springframework.data.redis.core.RedisTemplate; public class MessagePublisher { private final RedisTemplate<String, Object> redisTemplate; public MessagePublisher(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } public void sendMessage(String userNo, String message) { var jsonObject = new JSONObject(); jsonObject.put("message", message); redisTemplate.convertAndSend("websocket." + userNo, jsonObject.toString()); } } ``` 上述代码中,`convertAndSend` 方法会将 JSON 对象转换为字符串并通过 Redis 推送给订阅者。 #### 3. WebSocket 处理器 WebSocket 是一种全双工通信协议,在服务器端需要处理用户的连接请求以及分发来自 Redis 的消息。这里以 Fleck 库为例说明 C# 下的实现方式[^3]。 ##### (a) 初始化 WebSocket Server 创建一个简单的 WebSocket server,监听客户端连接事件: ```csharp using System.Collections.Generic; using Fleck; // 引用 Fleck 库 var allSockets = new List<IWebSocketConnection>(); var server = new WebSocketServer("ws://0.0.0.0:8181"); server.Start(socket => { socket.OnOpen = () => { allSockets.Add(socket); }; socket.OnClose = () => { allSockets.Remove(socket); }; }); ``` ##### (b) 将 Redis 消息转发给 WebSocket 客户端 当接收到 Redis 消息时,遍历当前所有已打开的 WebSocket 连接并将消息传递过去: ```csharp void BroadcastMessageToClients(string channelName, string messageJson) { foreach(var socket in allSockets) { try { socket.Send(messageJson); } catch {} } } // Simulate receiving a message from Redis Pub/Sub system. BroadcastMessageToClients("websocket.user123", "{\"event\":\"new_message\",\"data\":\"Hello!\"}"); ``` 此部分逻辑可以根据实际业务需求调整过滤条件或者针对不同类型的用户做更精细的消息路由管理。 --- #### 总结 以上展示了如何利用 Redis发布/订阅能力配合 WebSocket 构建一套基础版的实时消息推送架构。具体来说,Redis 负责存储和传播数据流,而 WebSocket 则负责维持与前端之间的稳定链接以便及时送达更新内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值