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

WebSocket实时双向通信:从基础到实战

一、WebSocket 基础概念

1. 什么是 WebSocket?

  • 双向通信协议:与 HTTP 的单向请求不同,WebSocket 支持服务端和客户端实时双向通信

  • 低延迟:适用于聊天室、实时数据推送、在线游戏等场景。

  • 协议标识ws://(非加密)或 wss://(加密)。


二、环境准备

1. 开发环境

  • .NET 版本:.NET Framework 4.5+ 或 .NET Core 3.1+

  • IDE:Visual Studio 2019+ 或 VS Code

  • 命名空间System.Net.WebSockets


三、服务端实现(ASP.NET Core)

1. 创建 WebSocket 服务端

using System.Net.WebSockets;
using System.Text;public class WebSocketHandler
{public async Task HandleWebSocket(HttpContext context){// 1. 接受 WebSocket 连接请求WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();// 2. 接收客户端消息var buffer = new byte[1024];WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);while (!result.CloseStatus.HasValue){// 3. 解析消息内容string message = Encoding.UTF8.GetString(buffer, 0, result.Count);Console.WriteLine($"收到消息: {message}");// 4. 回复客户端(示例:原样返回消息)await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count),result.MessageType,result.EndOfMessage,CancellationToken.None);// 继续接收下一条消息result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);}// 5. 关闭连接await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);}
}
 

2. 配置 ASP.NET Core 中间件

// Program.cs
app.UseWebSockets(); // 启用 WebSocket 中间件app.Map("/ws", async context =>
{if (context.WebSockets.IsWebSocketRequest){var handler = new WebSocketHandler();await handler.HandleWebSocket(context);}else{context.Response.StatusCode = 400;await context.Response.WriteAsync("请使用 WebSocket 协议访问");}
});
 

四、客户端实现(控制台应用)

1. 客户端连接代码

using System.Net.WebSockets;
using System.Text;public class WebSocketClient
{public async Task ConnectAsync(string url){ClientWebSocket webSocket = new ClientWebSocket();// 1. 连接到服务端await webSocket.ConnectAsync(new Uri(url), CancellationToken.None);Console.WriteLine("已连接到服务端");// 2. 发送消息string message = "Hello, WebSocket!";byte[] buffer = Encoding.UTF8.GetBytes(message);await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);// 3. 接收服务端响应buffer = new byte[1024];WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);string response = Encoding.UTF8.GetString(buffer, 0, result.Count);Console.WriteLine($"收到回复: {response}");// 4. 关闭连接await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "关闭连接", CancellationToken.None);}
}
 

2. 调用客户端

// Main 方法
static async Task Main(string[] args)
{WebSocketClient client = new WebSocketClient();await client.ConnectAsync("ws://localhost:5000/ws");
}
 

五、运行测试步骤

  1. 启动服务端

    dotnet run
     
  2. 运行客户端
    客户端控制台输出:

    已连接到服务端
    收到回复: Hello, WebSocket!
     

六、核心 API 说明

方法/属性说明
AcceptWebSocketAsync()服务端接受 WebSocket 连接请求
SendAsync()发送消息(支持文本和二进制数据)
ReceiveAsync()异步接收消息
CloseAsync()正常关闭连接
WebSocketMessageType.Text指定消息类型为文本

七、注意事项

  1. 跨域问题
    在 ASP.NET Core 中配置 CORS:

    services.AddCors(options => options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()));
     
  2. 心跳检测
    添加心跳机制防止连接超时:

    webSocket.Options.KeepAliveInterval = TimeSpan.FromSeconds(30);
     
  3. 异常处理
    使用 try-catch 捕获 WebSocketException

    try {// WebSocket 操作代码
    } catch (WebSocketException ex) {Console.WriteLine($"连接异常: {ex.Message}");
    }
     
  4. 性能优化

    • 使用 ArrayPool<byte> 重用缓冲区

    • 多线程处理高并发连接

相关文章:

  • LlamaIndex中应用自定义提示词提升回答质量
  • 【25软考网工】第六章(7)网络安全防护系统
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究
  • 【C++】map和set的使用
  • @JsonProperty和@JSONField 使用
  • 5.18 打卡
  • Android日活(DAU)检测的四大实现方案详解
  • Android 性能优化入门(三)—— 启动速度优化
  • weibo_comment_pc_tool | 我于2025.5月用python开发的评论采集软件,根据帖子链接爬取评论的界面工具
  • 牛客网NC276110题解:小红的数组重排
  • 低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player
  • 湖北理元理律师事务所:债务优化服务的四维创新实践
  • C++23 范围迭代器作为非范围算法的输入 (P2408R5)
  • Ubuntu22.04开机运行程序
  • 自动化:批量文件重命名
  • OSI七层模型和TCP/IP的五层(四层模型)
  • MLLM常见概念通俗解析(三)
  • QT6 源(108)篇二:阅读与注释菜单栏里的菜单对象 QMenu,先是成员函数,后是信号函数的测试
  • React路由(React学习笔记_09)
  • 计算机组成与体系结构:Snooping-Based Protocols(监听式协议)
  • 左手免费午餐右手花开岭,邓飞14年公益之路的中国贡献
  • CBA官方对孙铭徽罚款3万、广厦投资人楼明停赛2场罚款5万
  • 福建、广西等地有大暴雨,国家防总启动防汛四级应急响应
  • 上海位居全球40城科技传播能力第六名
  • 俄媒:俄乌代表团抵达谈判会场
  • 受贿1.29亿余元,黑龙江省原副省长王一新被判无期