首页 > 其他分享 >使用JS和SignalR完成双向通信

使用JS和SignalR完成双向通信

时间:2023-12-16 23:55:57浏览次数:33  
标签:function app 双向通信 JS SignalR connection message builder

写在前面:

看官网介绍,听开发者朋友的感受,SignalR对websocket等多个长连接协议进行了封装,提供了多种方法,能够适应很多场合和复杂情况。单纯论简单的web长连接,它确实没有js/nodejs版的websocket直观、简单。微软的风格,一来就高大上,不知道又会劝退多少人,会不会把自己玩死。

我帮你简单入门,希望你能体会到它的美。


 

web端

html:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>SignalR Example</title>
 5     <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.1/signalr.js"></script>
 6 </head>
 7 <body>
 8     <h1>SignalR Example</h1>
 9 
10     <script>
11         // 创建 SignalR 连接
12         var connection = new signalR.HubConnectionBuilder()
13             .withUrl("http://localhost:5267/chathub")
14             .build();
15 
16         // 注册事件处理程序
17         connection.on("messageReceived", function (message) {
18             console.log(message);
19         });
20 
21         // 启动连接
22         connection.start()
23             .then(function () {
24                 console.log("SignalR connection started.");
25             })
26             .catch(function (err) {
27                 console.error(err.toString());
28             });
29 
30         // 发送消息
31         function sendMessage() {
32             var message = document.getElementById("messageInput").value;
33             connection.invoke("sendMessage", message)
34                 .catch(function (err) {
35                     console.error(err.toString());
36                 });
37         }
38     </script>
39 
40     <input type="text" id="messageInput" />
41     <button onclick="sendMessage()">Send Message</button>
42 </body>
43 </html>

说明:

1、第5行引用官方SignalR的js库。官方位置(版本升级,链接可能会变。这里给官方文档位置图)

 2、17行的事件是给服务端回调用的。

3、33行调用服务器方法,发送数据。

 

服务端:

新建的是asp.net的空项目,一点点添加内容。

思想:

1、SignalR的类,继承自Hub。

2、在管道里配置它,书写路径映射即可。

3、默认禁止跨域(这一点和websocket不同),前后端分离调试需要注意。

代码(路径略):

ChatHub.cs:

 1 using Microsoft.AspNetCore.SignalR;
 2 
 3 namespace SignalRChat.Hubs
 4 {
 5     public class ChatHub : Hub
 6     {
 7         public async Task SendMessage(string message)
 8         {
 9             await Clients.All.SendAsync("messageReceived", "server:"+message);
10         }
11     }
12 }

第7行的方法名称,通常由客户端调用。(见前面html的第33行)

第9行向客户端发送事件和参数。(对应html的第17行)

Program.cs:

 1 using SignalRChat.Hubs;
 2 
 3 namespace WebApplication1
 4 {
 5     public class Program
 6     {
 7         public static void Main(string[] args)
 8         {
 9             var builder = WebApplication.CreateBuilder(args);
10 
11             builder.Services.AddSignalR();
12 
13             builder.Services.AddCors(options =>
14             {
15                 options.AddDefaultPolicy(
16                     builder =>
17                     {
18                         builder.WithOrigins("http://127.0.0.1:5500")
19                             .AllowAnyHeader()
20                             .WithMethods("GET", "POST")
21                             .AllowCredentials();
22                     });
23             });
24 
25             var app = builder.Build();
26 
27             app.UseCors();
28 
29             app.MapHub<ChatHub>("/chatHub");
30 
31             app.MapGet("/", () => "Hello World!");
32 
33             app.Run();
34         }
35     }
36 }

说明:11-23、27-29行为添加。


 至此,可以运行。

(完)

标签:function,app,双向通信,JS,SignalR,connection,message,builder
From: https://www.cnblogs.com/wanjinliu/p/17908563.html

相关文章

  • 使用js和nodejs完成websocket双向通讯
    如题。感谢AI。先用js完成一个最简单的例子。web端:html:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><scriptsrc="j1.js"></script></head>......
  • 使用JS脚本修改页面内容
    在学习RPA时,我对使用JS脚本修改页面内容进行了深入学习。记录如下:获取元素的方法:1.document.getElementById("xxx")2.document.getElementsByClassName("xxx")3.document.getElementsByTagName("xxx")4.document.getElementsByName("xxx")5.document.querySele......
  • 第三章:SpringBoot集成jsp、mybatis的逆向工程和集成
    一、springboot继承jsp二、mybatis逆向工程三、集成mybatis四、案例-集成mybatis五、集成mybatis总结......
  • vue3+vite+js中二次封装axios
    一、安装axiosnpmiaxios二、文件结构涉及到的文件:utils/request.sjapi/index.js(可以根据不同页面在api文件下新建不同文件夹,方便管理)vite.config.js三、request.js对axios进行简单的二次封装importaxiosfrom"axios";constrequest=axios.create({//......
  • Nestjs的Provider 和依赖注入
    前言上文介绍了如何理解依赖注入和控制反转,简单来说,控制反转是一种设计模式,可以将类与类的关系解耦,将人工维护转移给一个容器维护。要实现控制反转,依赖注入是一个常用方案,将依赖注册到DI容器中,哪里用到,就让容器将实例注入到哪里。Nest中的依赖注入,主要就是围绕提供者(Provider)展......
  • [JS] JS单例模式的实现
    JS单例模式的实现单例模式简介单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,提供了一种创建对象的最佳方式。特点:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当......
  • tsconfig.json文件配置
    tsconfig.json配置TypeScript使用tsconfig.json文件作为其配置文件,当一个目录中存在tsconfig.json文件,则认为该目录为TypeScript项目的根目录。基础字段files-设置要编译的文件的名称;['./src/main.tsx']include-设置需要进行编译的文件,支持路径模式匹配;['src']......
  • nodejs使用sequelize vscode报错:Type 'Model<any, any, any>' is not a constructor f
    我的模型定义如下:import{Model,DataTypes}from"sequelize";//定义资源模型classRuleextendsModel{}问题:vscdoe报错:Type'Model<any,any,any>'isnotaconstructorfunctiontype.解决:这个问题可能是由于TypeScript类型定义的问题导致的。Model 是Seq......
  • 【前端开发】Next.js VS Nest.js–Nest和Next之间的区别
    web开发框架起到支持作用,并提供了开发应用程序的有效方法。它具有不同的功能和特性,这使得开发过程更容易,开发人员总是能找到最快的编码方式。这就是为什么,无论是后端还是前端框架,大多数开发人员都喜欢使用它。一些框架通常具有非凡的功能,可以最大限度地减少代码,使应用程序开发更快......
  • Java: OpenWeatherMap json Deserialization of Java Objects
    openweathermap.json{"coord":{"lon":114.0683,"lat":22.5455},"weather":[{"id":803,"main":"Clouds","description":"多云",......