Skip to content

实时应用

SignalR实现服务器与客户端的实时通信 ,可简化将实时 web 功能添加到应用程序的过程。 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用,而不是让服务器等待客户端请求新数据的能力。

概念

Persistent Connection(持久连接): 持久连接是一种特殊的 HTTP 连接,用于在 SignalR 中实现长时间保持连接状态的功能。它允许服务器端主动向客户端发送消息。

Hub(集线器): Hub 是 SignalR 中的一个核心概念,它是一个服务器端对象,用于管理一组客户端连接,并允许服务器和客户端之间进行实时通信。Hub 可以看作是客户端和服务器端通信的桥梁。

Hub Context(集线器上下文): Hub 上下文提供了一种方式来访问特定 Hub 的信息,例如客户端连接列表、群组管理等。

Hub Proxy(集线器代理): 客户端使用 Hub Proxy 与服务器端的 Hub 进行通信。它是一个客户端对象,代表了服务器上的 Hub。

使用

前端(js实现)

前端(ts实现)

安装

npm i @microsoft/signalr @types/node

后端

配置 SignalR 中心

csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();

app.MapHub<ChatHub>("/Chat");
csharp
public class ChatHub : Hub
{
    /// <summary>
    /// 当用户连接上
    /// </summary>
    /// <returns></returns>
    public override async Task OnConnectedAsync()
    {
        await Console.Out.WriteLineAsync("用户连接:" + Context.ConnectionId);
    }

    /// <summary>
    /// 用户断开连接
    /// </summary>
    /// <returns></returns>
    public override async Task OnDisconnectedAsync(Exception? exception)
    {
        await Console.Out.WriteLineAsync("用户断开连接:" + Context.ConnectionId);
        await base.OnDisconnectedAsync(exception);
    }

    /// <summary>
    /// 定义一个方法供客户端调用
    /// </summary>
    /// <param name="username"></param>
    /// <param name="message"></param>
    /// <returns></returns>
    public async Task SendMessage(string username, string message)
    {
        await Console.Out.WriteLineAsync("用户发送消息:" + username+ "message");
        //收到的消息发送所有人,调用服务端的messageReceived方法
        await Clients.All.SendAsync("messageReceived", username, message);
    }

    /// <summary>
    /// 强制下线
    /// </summary>
    /// <param name="ConnectionId"></param>
    /// <returns></returns>
    public async Task ForceOffline(string ConnectionId)
    { 
        await  Clients.Client(ConnectionId).SendAsync("forceoffline");
    }


}

更多关于资料可查阅官方文档