当前位置: 首页 > article >正文

Web实时通信@microsoft/signalr

概要说明

signalr 是微软对 websocket技术的封装;

  1. build() 与后端signalR服务建立链接;
  2. 使用 on 方法监听后端定义的函数;ps:由后端发起,后端向前端发送数据
  3. 使用 invoke 主动触发后端的函数;ps:由前端发起,前端向后端发送请求

安装依赖

pnpm install @microsoft/signalr --save

组件封装

import { HubConnection, HubConnectionBuilder } from "@microsoft/signalr";

class SignalRService {
  private connection: HubConnection | null = null;
  private connectionStatus:
    | "disconnected"
    | "connecting"
    | "connected"
    | "error" = "disconnected";
  private serverUrl: string = ""; // 建立链接的服务器地址

  constructor(private url: string) {
    this.url = url;
  }

  public async start() {
    this.connectionStatus = "connecting";
    try {
      this.connection = new HubConnectionBuilder()
        .withAutomaticReconnect()//断线自动重连
        .withUrl(this.serverUrl + `?fileId=${this.url}`)
        .build();

      //启动连接
      await this.connection.start();
      this.connectionStatus = 'connected';
      console.log("SignalR server 连接成功");

    } catch (error) {
      console.error("SignalR server 连接失败:", error);
      this.connectionStatus = "error";
      throw error;
    }
  }

//断开服务链接
  public async stop() {
    try {
      if (this.connection) {
        await this.connection.stop();
        this.connectionStatus = "disconnected";
        console.log("SignalR 断开连接");
      }
    } catch (error) {
      console.log(error);
    }
  }

  //重新链接
  public async reconnect() {
    if (this.connection) {
      await this.connection.stop();
      await this.connection.start();
      console.log("SignalR 重连中");
    }
  }

  //接收消息(接收后端发送给前端的数据)
  public async receiveMessage(callback: (message: string) => void, eventName: string) {
    if (this.connection) {
      this.connection.on(eventName, (message: string) => {
        callback(message);
      });
    }
  }

//发送消息(由前端发送消息,后端接收数据)
  public async send(message: string) {
    if (this.connection && this.connectionStatus === "connected") {
      await this.connection.invoke("SendMessage", message);
    } else {
      throw new Error("Connection is not established");
    }
  }

//获取当前状态
  public get status() {
    return this.connectionStatus;
  }
  
  public getConnection() {
    return this.connection;
  }
}

export default SignalRService;

使用案例

// 使用示例
const signalRService = new SignalRService('链接地址');
signalRService.start()
  .then(() => console.log('SignalR service started'))
  .catch(error => console.error('Failed to start SignalR service:', error));

// 在需要的时候发送消息
signalRService.send('Hello, SignalR!')
  .then(() => console.log('Message sent'))
  .catch(error => console.error('Failed to send message:', error));

// 接收消息
signalRService.receiveMessage((message: string) => {
  console.log("Received message:", message);
}, "后端定义的方法名称(获取由后端给前端发送的数据)")

// 停止连接
signalRService.stop();

http://www.kler.cn/a/420759.html

相关文章:

  • 命令模式 (Command Pattern)
  • 存储过程案例详解与应用示例
  • Qt清空文件夹下的内容
  • TCP、HTTP、RPC
  • java基础教程3 java基础语法
  • ubuntu 和windows时区设置和时间修改
  • C语言第十四周课——课堂练习
  • pip更换国内源,加速Python包下载(附2024年12月最新国内镜像源列表)
  • Unity3D 设置图片拉伸四角不变形
  • PhPMyadmin-漏洞复现
  • 工业公辅车间数智化节能头部企业,蘑菇物联选择 TDengine 升级 AI 云智控
  • [在线实验]-RabbitMQ镜像的下载与部署
  • android 阻止返回退出
  • 【笔记总结】华为云:应用上云后的安全规划及设计
  • form表单阻止默认事件及获取值
  • PH热榜 | 2024-12-02
  • Milvus Cloud 2.5:向量数据库的新里程碑与全文检索的革新
  • 大数据治理:解锁数据价值,引领未来创新
  • windows C#-测试引用相等性
  • 人机交互中的状态交互、趋势交互
  • vue 3中使用复制功能
  • C++【PCL】利用矩阵对点云进行刚体变换
  • golang的wails框架在macos下的问题
  • 基于STM32的电能监控系统设计:ModBus协议、RS-485存储和分析电能数据(代码示例)
  • 使用kaggle提供的免费gpu来实现语音克隆
  • Proxy与CGLib代理:深入解析与应用