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

Websocket在Asp.net webApi(.net framework)上的应用

之前在写看板部分的web api的时候,都是通过Ajax在规定时间内轮询调用web api,这样简单省事,但是当看板多了(并发量上来)以后,比较消耗服务器的性能,所以最近研究了websocket,希望使用websocket只在数据发生变化时向客户端推送数据。

支持通过 TCP 连接建立持久的双向信道

方案1:Ajax,每隔一断时间轮询一次

方案2:WebScoket协议,ws, http2,客户端支持良好。

JS前端WebScoket:

WebSocket - Web API 接口参考 | MDN

https://blog.51cto.com/u_16213389/9357097

WebSocket的使用方法(JS前端)_前端websocket怎么用-CSDN博客

后端:

本文介绍 ASP.NET Core 中 WebSocket 的入门方法。 WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道。 它用于从快速实时通信中获益的应用,如聊天、仪表板和游戏应用。

使用基于 HTTP/2 的 WebSockets 可利用以下新功能:

  • 标头压缩。
  • 多路复用,可减少向服务器发出多个请求时所需的时间和资源。

所有支持 HTTP/2 的平台上的 Kestrel 中都提供了这些受支持的功能。 版本协商在浏览器和 Kestrel 中是自动的,因此不需要新的 API。

https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/websockets/samples

=================================

流览器支持情况:

WebSocket - Web API 接口参考 | MDN

WebSocket

WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的 API。

使用 WebSocket() 构造函数来构造一个 WebSocket

==========================

JavaScript 长链接实现指南
1. 简介
在网络编程中,常常需要建立长时间保持连接的通信方式,这种方式被称为长链接。在 JavaScript 中,我们可以使用 WebSocket 技术来实现长链接通信。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以在客户端和服务器之间实现实时数据传输。

本文将指导你如何使用 JavaScript 实现长链接通信,具体包括以下几个步骤:

建立 WebSocket 连接
通过 WebSocket 发送和接收数据
处理 WebSocket 的连接状态和错误
关闭 WebSocket 连接
2. 实现步骤
下面是实现 JavaScript 长链接的步骤概览:

步骤    描述
1    创建 WebSocket 对象
2    监听 WebSocket 事件
3    建立与服务器的连接
4    发送数据
5    接收数据
6    处理连接状态和错误
7    关闭连接
3. 代码实现
3.1 创建 WebSocket 对象
在 JavaScript 中,可以使用 new WebSocket(url) 创建一个 WebSocket 对象。其中,url 是要连接的 WebSocket 服务器的地址。

// 创建 WebSocket 对象
const socket = new WebSocket('ws://example.com');
1.
2.
3.2 监听 WebSocket 事件
WebSocket 对象提供了一系列事件,可以监听连接状态、接收数据和处理错误。下面是常用的几个事件和对应的代码:

// 监听连接建立事件
socket.onopen = (event) => {
  console.log('连接已建立');
};

// 监听接收数据事件
socket.onmessage = (event) => {
  const data = event.data;
  console.log('接收到数据:', data);
};

// 监听连接关闭事件
socket.onclose = (event) => {
  console.log('连接已关闭');
};

// 监听连接错误事件
socket.onerror = (error) => {
  console.error('连接错误:', error);
};
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
3.3 建立与服务器的连接
在 WebSocket 对象上触发 open 事件后,表示与服务器建立连接成功。

socket.onopen = (event) => {
  console.log('连接已建立');
};
1.
2.
3.
3.4 发送数据
可以使用 WebSocket 对象的 send(data) 方法发送数据给服务器。

// 发送数据给服务器
socket.send('Hello, server!');
1.
2.
3.5 接收数据
当服务器发送数据到客户端时,会触发 WebSocket 对象的 message 事件,我们可以在事件处理函数中获取到接收到的数据。

socket.onmessage = (event) => {
  const data = event.data;
  console.log('接收到数据:', data);
};
1.
2.
3.
4.
3.6 处理连接状态和错误
在 WebSocket 对象上触发 close 事件后,表示连接已关闭。可以在该事件处理函数中执行一些清理操作。

socket.onclose = (event) => {
  console.log('连接已关闭');
};
1.
2.
3.
如果连接出现错误,会触发 WebSocket 对象的 error 事件。我们可以在事件处理函数中处理错误信息。

socket.onerror = (error) => {
  console.error('连接错误:', error);
};
1.
2.
3.
3.7 关闭连接
可以使用 WebSocket 对象的 close([code[, reason]]) 方法关闭与服务器的连接。code 是可选的关闭状态码,reason 是可选的关闭原因。

// 关闭连接
socket.close();
1.
2.
4. 总结
通过以上步骤,我们可以使用 JavaScript 实现长链接通信。首先创建 WebSocket 对象,然后监听连接状态、接收数据和处理错误的事件。接着建立与服务器的连接,通过 send 方法发送数据,通过 message 事件接收数据。最后,处理连接状态和错误,并可以使用 close 方法关闭连接。
 

相关文章:

  • JAVA后端开发面试基础知识(九)——SpringBoot
  • 机器学习模型—逻辑回归
  • Win11系统启动VMware上虚拟机蓝屏解决办法
  • 十步打造JAVA应用服务器
  • go docker sdk 使用 第二章
  • ubuntu 23.04 安装 中文输入法
  • Unity3d Shader篇(十四)— 卡通着色
  • GPT与R 在生态环境领域数据统计分析
  • python中的排序函数用法:A.sort(key=lambda x: abs(x), reverse=True)
  • 力扣654. 最大二叉树
  • IOS降级后从高版本到低版本恢复备份
  • elasticsearch(学习笔记)(分布式搜索引擎)(黑马)(kibana操作)
  • 雷卯推荐基于USB 快充(USB-PD) 浪涌保护器件
  • 使用Julia语言和R语言实现K-均值
  • 垃圾收集器底层算法
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [deviceone开发]-do_Webview的基本示例
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android 架构优化~MVP 架构改造
  • canvas绘制圆角头像
  • If…else
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript类型识别
  • mysql 数据库四种事务隔离级别
  • node学习系列之简单文件上传
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PhantomJS 安装
  • Python进阶细节
  • 基于 Babel 的 npm 包最小化设置
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微服务框架lagom
  • 微信开源mars源码分析1—上层samples分析
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (分布式缓存)Redis持久化
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十一)图像的罗伯特梯度锐化
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • ***检测工具之RKHunter AIDE
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET delegate 委托 、 Event 事件
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • [C++]AVL树怎么转
  • [FTP]pureftp部署和优化
  • [FUNC]判断窗口在哪一个屏幕上
  • [HDU] 1054 Strategic Game 入门树形DP
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [LeetCode]—Roman to Integer 罗马数字转阿拉伯数字
  • [Lucene] Lucene 全文检索引擎简介
  • [one_demo_5]命令行输入输出