1. 安装@microsoft/signalr

pnpm install @microsoft/signalr --save

signalr  是微软对 websocket技术的封装,优化了操作 ;
1. build 和后端signalR服务建立关联
2. 使用 on 方法监听后端定义的函数,ps:此函数由后端触发,后端发送数据给前端
3. 使用 invoke 主动触发后端的函数,ps:由前端触发,前端可以发送数据给后端

2. 封装组件 js


import * as signalR from '@microsoft/signalr'
import { ref } from "vue"
const opt = ref<any>(
 {
  // 禁止协商
  skipNegotiation: true,
  // 使用 websocket 协议
  transport: signalR.HttpTransportType.WebSockets,
  // 启用日志
  logging: true
 }
)
opt.HttpMessageHandlerFactory = (handler: any) => {
 var newHandler = handler as any;
 newHandler.ServerCertificateCustomValidationCallback = (request: any, cert: any, chain: any, errors: any) => {
  return true;
 };
 return newHandler;
}
export function SignalR() {
 const _signalR: any = {
  connection: null,
  connectionStatus: false,
  // url 必须写全路径
  build(url: string) {
   console.log(url)
   const connection = new signalR.HubConnectionBuilder()
    .withUrl(url, opt.value)
    .withAutomaticReconnect({
     nextRetryDelayInMilliseconds: retryContext => {
      if (retryContext.elapsedMilliseconds < 60000) {
       // If we've been reconnecting for less than 60 seconds so far,
       // wait between 0 and 10 seconds before the next reconnect attempt.
       return 2000
      } else {
       // If we've been reconnecting for more than 60 seconds so far, stop reconnecting.
       return 5000
      }
     }
    })
    // .withAutomaticReconnect([0, 2000, 5 * 1000, 10 * 1000, 30 * 1000, 60 * 1000, 120 * 1000, 120 * 1000, 120 * 1000])
    .build()
   this.connection = connection
   console.log(connection.state);
   console.log(signalR.HubConnectionState.Connected);
   // if (connection.state === signalR.HubConnectionState.Connected) {
   //   this.handles();
   // }
   this.handles()
   console.log('signalR初始化成功', this)
   return this
  },
  handles() {
   const that: any = this
   // Starts the connection.
   function start() {
    console.log('start方法执行');
    that.connection.start().then((message: any) => {
     console.log('start成功', message);
     that.startSuccess(message)
    }).catch((err: any) => {
     if (that.connectionStatus === true) {
      console.error("start失败", err)
      setTimeout(() => {
       start()
      }, 1000)
     }
    })
   }
   start()
   // invoked when the connection is closed.
   this.connection.onclose(async (error: any) => {
    this.closeSuccess(`signalR connection closed. error: ${error}`);
    await this.connection.start();
   });
   // this.connection.onclose(error => {
   //  this.closeSuccess(`signalR connection closed. error: ${error}`)
   // })
   // 重连时触发
   this.connection.onreconnecting((error: any) => {
    this.reconnecting(error)
   })
   // invoked when the connection successfully reconnects.
   this.connection.onreconnected((connectionId: any) => {
    this.reconnectedSuccess(connectionId)
   })
  },
  stop() {
   // Stops the connection.
   this.connection && this.connection.stop().then(() => {
    this.stopSuccess()
   }).catch((err: any) => console.error(err))
  },
  startSuccess(message: any) {
   console.log(`start成功, ${message}`)
  },
  closeSuccess(message: any) {
   console.log(`close成功, ${message}`)
  },
  reconnecting(err: any) {
   console.log(`正在重连, ${err}`)
  },
  reconnectedSuccess(connectionId: any) {
   console.log(`reconnected成功, ${connectionId}`)
  },
  stopSuccess() {
   console.log(`stop stopSuccess成功`)
  },
  invoke(methodName: any, args: any) {
   console.log('invoke方法触发,传送args参数给后端,由客户端主动触发就用invoke');
   this.connection && this.connection.invoke(methodName, args).catch((err: any) => console.error("errerrerr", err))
  },
  on(methodName: any, newMethod = () => { }) {
   console.log('on方法触发 开始监听,由后端触发使用on监听,从后端接收数据')
   this.connection && this.connection.on(methodName, newMethod)
  },
  off(methodName: any, newMethod: any) {
   if (!this.connection) {
    return false
   }
   if (newMethod) {
    this.connection.off(methodName, newMethod)
   } else {
    this.connection.off(methodName)
   }
  }
 }
 return _signalR
}
 

3. 使用   【 按需 】

import { SignalR } from '@/utils/signalR'
let si = SignalR();
try {
si.build('http://192.168.1.63:5965/chatHub')
si.on("ReceiveMessage",(tt)=>{
if(tt.substring(0,1) === "{") {
tt = JSON.parse(tt)
console.log('原来数据',tt,typeof tt);
// 逻辑操作
formInline.formData.barcodename = tt.BarcodeName
formInline.formData.batch = tt.Batch
formInline.formData.valid_s = tt.BirthDate
formInline.formData.serial = tt.Serial
}else {
console.log('原来数据',tt,typeof tt);
// 赋值操作
formInline.formData.tagid = tt
}
})
} catch (error) {
console.log('signarl 出错');
}

CSharp的@microsoft/signalr实时通信教程 - 前端 vue的更多相关文章

  1. [置顶] MVC中使用signalR入门教程

    一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态.全身都有点酸痛,这个可能一个星期只有周末才打一 ...

  2. github上最全的资源教程-前端涉及的所有知识体系【转】

    github上最全的资源教程-前端涉及的所有知识体系[转自:蓝猫的博客] 综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.h ...

  3. 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式

    1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...

  4. 史上最全面的SignalR系列教程-6、SignalR 实现聊天室

    1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...

  5. SignalR系列教程:SignalR快速入门

    ---恢复内容开始--- 本篇是SignalR系列教程的第一篇,本篇内容介绍了如何创建SignalR应用,如何利用SignalR搭建简易的聊天室等,本篇内容参考自:http://www.asp.net ...

  6. 前后端不分离部署教程(基于Vue,Nginx)

    有小伙伴私信问我vue项目是如何进行前后端不分离打包发布的,那我岂能坐视不管,如此宠粉的我肯定是要给发一篇教程的,话不多说,开始操作 前端假如我们要发布我们的Vue项目,假设我们前端用的是histor ...

  7. 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式

    1.概述 通过前两篇 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 文章对SignalR的介绍, ...

  8. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  9. 史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  10. 史上最全面的SignalR系列教程-目录汇总

    1.引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习. 致正在奔跑的您! 2.SignalR介绍 SignalR实现服务器与客户端的实时通信 ,她是一个 ...

随机推荐

  1. 【Git】GithubDesktop 忽略文件无法忽略BUG

    问题描述: 从仓库拉取的[.gitignore]忽略配置文件,在项目跑起来之后会生成诸多.idea文件,target打包文件 一开始没有忽略,但是发现使用GD配置之后忽略无效: 解决办法: 做一次随便 ...

  2. 【Server - 运维】更改腾讯云数据库参数设置

    购买的MySQL实例是一个屏蔽了后台设置的服务器: 默认大小写设置是使用严格区分的: 要设置忽略大小写,就要在my.cnf中更改配置参数 https://cloud.tencent.com/devel ...

  3. 【C3】03 如何构建

    既然你已经了解了什么是CSS,以及使用CSS的基础知识,是时候更深入的了解该语言本身的结构了. 我们已经见过了本页讨论的很多概念:如果在之后对某些概念感到困惑的话,可以返回至此进行回顾. 前置知识 在 ...

  4. 【Git】05 分支管理

    查看所有分支: git branch Git将列出所有分支,如果是当前使用的分支,前面会加一个星号表示 创建一个新的分支: git branch 分支名称 创建一个分支并且指向该分支: git che ...

  5. 特朗普开始在YouTube上打竞选广告了 —— 美国总统的竞选广告已经开始媒体投放了

    相关: 拜登开始在YouTube上打竞选广告了 -- 美国总统的竞选广告已经开始媒体投放了 PS. 又多了一个猴上台,哈哈哈. 特朗普的竞选资金筹集网站:

  6. CUDA11.3编译pytorch2.0.1报错:error: ‘nvmlProcessInfo_v1_t’ was not declared in this scope

    问题如题: CUDA11.3编译pytorch2.0.1报错:error: 'nvmlProcessInfo_v1_t' was not declared in this scope 解决方法参考: ...

  7. 在深度学习的视觉VISION领域数据预处理的魔法常数magic constant、黄金数值的复现: mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]

    代码: https://gist.github.com/pmeier/f5e05285cd5987027a98854a5d155e27 import argparse import multiproc ...

  8. python连接钉钉自动化提交OA审批

    一.准备工作 1.安装阿里云支持包,点击跳转:https://open.dingtalk.com/document/resourcedownload/download-server-sdk 2.注册钉 ...

  9. 【全】CSS动画大全之其他【移动盒子显示详情】

    效果预览 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  10. FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构

    ​音视频技术的一个主要用途是直播,包括电视直播.电脑直播.手机直播等等,甚至在线课堂.在线问诊.安防监控等应用都属于直播系统的范畴.由于直播系统不仅涉及到音视频数据的编解码,还涉及到音视频数据的实时传 ...