.NET修仙传
修炼秘籍
.net 修炼路线图
书籍大全
C#入门后该如何进阶?如何提升自己?
读写 Excel 四种方案
书籍大全
dotnet命令大全
C# 程序集加载方法
linux 下部署.net环境
.NET WebAPI中FromRoute、FromQuery、FromBody的关键角色与用法
C# 新用法
盘点C#最有价值的10个语法糖
C#基础语法与数据类型
序列化
C# 7.0
模式匹配Pattern Matching
优秀实用的类库推荐
2024年C#优秀实用的类库推荐
依赖注入与中间件
依赖注入
查询所有已注入的服务
WebApi实现批量注入
原生依赖注入
自动依赖注入框架
优秀中间件
依赖注入
Autofac
生命周期
文档操作
PDF操作
PDF合并及生成书签目录
Excel操作
几个Excel文件合并去重分类
Excel文件之COM组件方式
操作Excel文件之NPOI
INI文件
面试宝典
WebService、WCF、WebAPI、一般处理程序
C# 线程和进程的区别
asp.net core 服务生命周期
asp.net core 的中间件都有哪些
操作系统编程
获取搜狗输入法中英文
com组件集成
执行系统命令
通过句柄嵌入exe窗体程序
windows-开机自启动
程序调用cmd命令生成WCF服务的客户端调用文件
获取电脑信息
键盘记录器
键盘改键功能
监听鼠标操作
框架揭秘
01编程初体验
中间件 Middleware
路由
配置管理
配置系统
配置管理
日志管理
Log4Net
NLog
.net core原始日志记录
日志管理
Serilog
LINQ
LINQ概讲
LINQ编程
常用方法
ORM
EF Core初始化
EF Core的实体类配置
执行原生SQL语句
EF Core
操作sqlite
操作Mysql数据库
操作LiteDB
AutoMapper高效实现对象映射
AutoMapper
AutoMapper 10个常用方法总结
缓存
Redis支持哪几种数据类型?
什么是Redis?简述它的优缺点?
Redis相比memcached有哪些优势?
认证
什么是 JWT?它是如何工作的?
.net framework jwt
.net core Jwt操作
认证管理
.Net WebApi校验Token/参数的几种方式
鉴权授权
Authorization的几种方式
基础语法
集合
1、C#中常用集合类型
yield return 简化迭代并提高代码质量
AOP
.net core AOP
操作筛选器
网络编程
TCP 连接的前世今生
HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别
网络编程
WebApi获取客户信息
通信
HTTP通信
公共类-HttpHelper
多线程编程
十种线程方式分析
Task-筑基期
parallel-筑基
消息队列
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
构建高性能 API 的高级技术
优秀教程网站
每日学习地址
全套教程汇总
理解ASP.NET Core
定时任务
定时器的三种使用方式
定时任务之windows任务计划程序
创建任务到Windows任务计划程序
定时任务之Quartz.Net
IHostedService启动时运行定时任务
JSON序列化反序列化工具
前辈
发布部署
应用部署
GRPC
使用GRPC多个proto文件
本文档使用 MrDoc 发布
-
+
首页
WebSocket 通信
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它提供了比传统HTTP请求/响应模型更低的延迟和更高的效率,非常适合实时数据流、聊天应用、在线游戏等场景。在C#中,无论是服务器端还是客户端,都可以使用WebSocket进行通信。 # 1、客户端使用 WebSocket 在C#中,你可以使用System.Net.WebSockets命名空间下的ClientWebSocket类来创建WebSocket客户端。下面是一个简单的示例,展示了如何连接到WebSocket服务器并发送和接收消息: ```java using System; using System.IO.Pipelines; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; /// <summary> /// WebSocket客户端类,用于与WebSocket服务器建立连接和通信。 /// </summary> public class WebSocketClient { /// <summary> /// 客户端WebSocket实例。 /// </summary> private readonly ClientWebSocket _webSocket = new ClientWebSocket(); /// <summary> /// 用于取消操作的CancellationTokenSource。 /// </summary> private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); /// <summary> /// 连接到指定的WebSocket服务器。 /// </summary> /// <param name="uri">WebSocket服务器的URI。</param> public async Task Connect(string uri) { // 使用提供的URI连接到WebSocket服务器 await _webSocket.ConnectAsync(new Uri(uri), _cancellationTokenSource.Token); } /// <summary> /// 向WebSocket服务器发送消息。 /// </summary> /// <param name="message">要发送的消息字符串。</param> public async Task SendMessage(string message) { // 将消息转换为UTF8编码的字节 byte[] buffer = Encoding.UTF8.GetBytes(message); // 创建ArraySegment,封装要发送的字节缓冲区 ArraySegment<byte> segment = new ArraySegment<byte>(buffer); // 发送消息到WebSocket服务器 await _webSocket.SendAsync(segment, WebSocketMessageType.Text, true, _cancellationTokenSource.Token); } /// <summary> /// 接收WebSocket服务器发送的消息。 /// </summary> /// <param name="onMessageReceived">接收到消息时调用的回调函数。</param> public async Task ReceiveMessage(Action<string> onMessageReceived) { // 当WebSocket连接处于打开状态时,持续接收消息 while (_webSocket.State == WebSocketState.Open) { var buffer = new byte[1024]; // 接收来自WebSocket服务器的数据 var result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), _cancellationTokenSource.Token); // 如果接收到的类型为关闭,则关闭连接 if (result.MessageType == WebSocketMessageType.Close) { await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); break; } // 将接收到的字节转换为字符串,并通过回调函数处理 var receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count); onMessageReceived(receivedMessage); } } /// <summary> /// 断开与WebSocket服务器的连接。 /// </summary> public async Task Disconnect() { // 取消接收和发送操作 _cancellationTokenSource.Cancel(); // 关闭WebSocket连接 await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); } } ``` # 2、服务器端使用 WebSocket 在服务器端,可以使用ASP.NET Core中的Microsoft.AspNetCore.WebSockets来支持WebSocket。 - Microsoft.AspNetCore.WebSockets ```java using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using System; using System.Threading.Tasks; public class Startup { /// <summary> /// 配置服务容器。 /// </summary> /// <param name="services">服务集合。</param> public void ConfigureServices(IServiceCollection services) { // 添加控制器服务 services.AddControllers(); } /// <summary> /// 配置应用管道。 /// </summary> /// <param name="app">应用构建器。</param> /// <param name="env">主机环境。</param> public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 在开发环境中启用异常页面 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 启用路由 app.UseRouting(); // 启用WebSocket中间件 app.UseWebSockets(); // 配置端点处理器 app.UseEndpoints(endpoints => { // 映射默认的GET请求处理器 endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); // 映射WebSocket请求处理器 endpoints.Map("/ws", async context => { // 检查当前请求是否为WebSocket请求 if (context.WebSockets.IsWebSocketRequest) { // 接受WebSocket连接 using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); // 持续监听WebSocket消息 while (true) { // 准备接收缓冲区 var buffer = new byte[1024 * 4]; // 接收WebSocket消息 var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); // 如果收到的类型为关闭消息,则关闭连接 if (result.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); break; } // 解码接收到的消息 var message = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine($"Received: {message}"); // 回复消息给客户端 await webSocket.SendAsync( new ArraySegment<byte>(Encoding.UTF8.GetBytes($"Echo: {message}")), result.MessageType, result.EndOfMessage, CancellationToken.None); } } else { // 如果不是WebSocket请求,则返回400错误 context.Response.StatusCode = 400; } }); }); } } ``` 在上面的服务器端代码中,首先启用了WebSocket中间件,然后映射了一个/ws端点来处理WebSocket连接。 当收到连接请求时,我们接受连接并进入循环,监听客户端发送的消息,然后简单地回传一个回显消息。 3、说明 WebSocket为C#开发者提供了强大的实时通信能力,无论是构建复杂的实时数据流应用还是简单的聊天室,WebSocket都是一个值得考虑的选择。通过掌握客户端和服务器端的实现细节,可以充分利用WebSocket的优势,创建高性能和低延迟的实时应用。
孙端己
2024年7月22日 17:21
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码