webSocket在.net中的使用案例

news/2025/2/27 14:14:29/文章来源:https://www.cnblogs.com/chenxizhaolu/p/18740868

前言

  前面asp.net实现长连接 - chenxizhaolu - 博客园学习了如何在asp.net中实现http长连接,这里继续学习websocket。

  WebSockets 是一种协议,它能让客户端和服务器之间通过单个长期连接进行无缝通信。与 HTTP 等遵循请求-响应模式的传统网络通信方法不同,WebSockets 引入了全双工通信通道。这意味着客户端和服务器可以同时发送和接收数据,从而实现即时更新和实时交互。

  WebSockets 常用于需要实时数据更新的场景。例如,多人游戏大厅聊天、实时通知、股票市场数据馈送和实时协作工具。这些应用需要即时通信和数据交换,而 WebSockets 恰好能提供这些功能。

创建服务端程序

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://localhost:5000");
var app = builder.Build();
app.UseWebSockets();
//收到消息后回应
app.Map("/ws", async context =>
{if (context.WebSockets.IsWebSocketRequest){using (var webSocket = await context.WebSockets.AcceptWebSocketAsync()){_ = Task.Run(async () =>{while (true){var message = "服务器心跳推送当前时间:" + DateTime.Now.ToLongTimeString();var buffer = Encoding.UTF8.GetBytes(message);var segment = new ArraySegment<byte>(buffer);await webSocket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);Thread.Sleep(3000);}});var buffer = new byte[1024 * 4];WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);var clientMsg = Encoding.UTF8.GetString(buffer, 0, result.Count);while (!result.CloseStatus.HasValue){var replayMessage = Encoding.UTF8.GetBytes("服务器收到了客户端的信息:" + clientMsg);await webSocket.SendAsync(new ArraySegment<byte>(replayMessage), WebSocketMessageType.Text, result.EndOfMessage, CancellationToken.None);result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);}await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);Console.WriteLine("WebSocket 连接已关闭");}}else{context.Response.StatusCode = (int)HttpStatusCode.BadRequest;}
});await app.RunAsync();

创建html客户端

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStaticFiles();
app.Run();
<body><h1>WebSocket 示例</h1><div><input type="text" id="messageInput" placeholder="输入消息"><button id="sendButton">发送</button></div><ul id="messages"></ul><script>// 创建 WebSocket 连接const ws = new WebSocket('ws://localhost:5000/ws');// 监听连接打开事件ws.onopen = () => {console.log('已连接到 WebSocket 服务器');appendMessage('服务器', '连接已建立');};// 监听服务器发送的消息ws.onmessage = (event) => {const message = event.data;console.log('收到服务器消息:', message);appendMessage('服务器', message);};// 监听连接关闭事件ws.onclose = () => {console.log('WebSocket 连接已关闭');appendMessage('服务器', '连接已关闭');};// 监听连接错误事件ws.onerror = (error) => {console.error('WebSocket 错误:', error);appendMessage('服务器', '连接错误');};// 发送消息document.getElementById('sendButton').addEventListener('click', () => {const message = document.getElementById('messageInput').value;if (message) {ws.send(message); // 向服务器发送消息appendMessage('', message);document.getElementById('messageInput').value = '';}});// 在页面上显示消息
        function appendMessage(sender, message) {const li = document.createElement('li');li.textContent = `${sender}: ${message}`;document.getElementById('messages').appendChild(li);}</script>
</body>

效果:

 

 

 

引用:使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端 - 实时互动网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890621.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL SERVER日常运维巡检系列之-性能

前言做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期、结果进行登记,同时可能需要出一份巡检报告。本系列旨在解决一些常见的困扰:不知道巡检哪些东西 不知道怎么样便捷体检 机器太多体检麻烦 生成报告困难,无法直观呈现结果 性能是系统好坏的重要指标之…

burpsuite激活

激活burpsuite——教程点击Start 文件,把三个框都选上点击RUN,会自动启动,复制一下那个证书粘贴刚刚复制的密钥,点击下一个即可这里点击手动激活,复制请求,粘贴到刚刚那个激活程序的:Activation Request 它会自动生成Response,Copy就行到Burpsutie 里面复制一下,然后点…

KBP310-ASEMI整流桥稳定电力的核心担当

KBP310-ASEMI整流桥稳定电力的核心担当编辑:ll 在当今电子科技飞速发展的时代,各类电子设备充斥着我们的生活,从日常使用的手机、电脑,到工业生产中的大型机械,稳定的电力供应都是它们正常运转的基石。而在这背后,有一个常常被忽视却又至关重要的元件 ——KBP310 整流桥。…

GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析

GraphQL 调试与文档生成:Apipost 如何简化开发流程 GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析 GraphQL 凭借其灵活的数据查询能力和高效的接口设计,是现代 API 开发的主流选择。根据 State of JS 2022 的调研,GraphQL 在开发者中的采用率已超过 40%,尤其…

大数据在项目管理中的应用:5个预测分析模型+工具

随着信息技术的飞速发展,大数据在各个领域的应用日益广泛,项目管理也不例外。大数据的分析和应用为项目管理带来了新的机遇和挑战,通过预测分析模型和工具,项目管理者可以更好地规划、执行和监控项目,提高项目的成功率和效益。本文将介绍大数据在项目管理中的应用,重点探…

抖音爆火—可爱俏皮的软件卸载提示页面制作

前两天在抖音刷到了一个很可爱的软件卸载页面,鼠标滑动还会变脸,很萌很可爱,所以想着自己也做一个,花了一下午时间总算写了出来,总体效果还可以,哈哈抖音爆火—可爱俏皮的软件卸载提示页面制作前言 ​ 前两天在抖音刷到了一个很可爱的软件卸载页面,鼠标滑动还会变脸,很…

内部类--成员内部类、静态内部类、局部内部类--java进阶day03

1.内部类 内部类分为4种,成员内部类用处不大,静态内部类和局部内部类更是鸡肋,唯有匿名内部类是需要我们重点掌握的1.成员内部类Inter类要访问Outer类的成员可以直接访问,而Outer要访问Inter,就必须创建出Inter对象才可访问案例2.静态内部类3.局部内部类

逆向软件开发--学生管理系统

本次实验目的:训练逆向软件设计与开发能力。 实验内容:找一个已有的项目,阅读分析,找出软件尚存的缺陷,改进其软件做二次开发,并将过程整理成博客。 来源:CSDN上的学生管理系统 链接: https://blog.csdn.net/weixin_74362817/article/details/142308755fromshare=blogd…

对自己独立开发游戏的能力考察~来自入行4年的小菜鸟自查

一直想设计开发一款自己喜欢玩的游戏,加入各种自己想要的元素,但是总感觉自己技术积累不够,这次刚好有空,尝试写一下,看看自己在哪方面比较欠缺,这次主要是为了检测自己独立开发的能力,着重战斗方面的设计,ui是随便弄的,原谅原谅 首先是主场景大地图,实现了地图创建加…

掌握领域驱动微服务中的聚合与实体

—— 从遗留单体系统转型为现代分布式系统的实战经验照片由 Shamin Haky 提供,来自 Unsplash你好啊,我是一名经验丰富的软件工程师,专注于大规模应用的设计。多年来,我见过各种架构——从庞大的单体架构,到精细调整过的微服务基础设施。 有一个核心概念,一直帮助我保持系…

PyCharm安装插件时出现Error loading package list:Unexpected end of file from server

将Manage Repositories中无法用的源删掉即可 截图为只保留了一个可用的源

day02 ip地址和服务器

day02 服务器与机房 上节回顾运维是什么: 简单来说保证服务器的安全稳定的运行今日内容 服务器的基础的知识 ip地址的查看 windows查看IP的命令是 ipconfig关于局域网,NAT的概念公网,局域网的概念,以及路由器帮你做了网络地址的转换运维不象写代码,纯靠动脑,不断的写吗,…