找回密码
 立即注册
首页 资源区 代码 C# 中 WebSocket 与 SignalR:实时通信的两种选择 ...

C# 中 WebSocket 与 SignalR:实时通信的两种选择

请蒂 2025-5-29 10:54:05
在现代 Web 应用中,实时通信变得越来越重要。无论是聊天应用、在线游戏、股票行情推送还是协作编辑工具,都需要服务器能够主动向客户端推送数据。在 .NET 生态系统中,WebSocketSignalR 是实现这一功能的两个主要方案。
本文将对这两种技术进行比较,分析它们的异同点和使用场景,并提供简单示例代码帮助你快速上手。
一、什么是 WebSocket?

WebSocket 是 HTML5 提供的一种全双工通信协议,允许客户端与服务器之间建立持久连接,实现双向实时通信。相比传统的 HTTP 请求-响应模式,WebSocket 更加高效,适合需要频繁交互的应用。
WebSocket 特点:


  • 基于 TCP 协议
  • 支持双向通信
  • 连接是长连接(保持打开)
  • 轻量级,性能高
  • 需要手动管理连接和消息处理
使用场景:


  • 实时数据推送(如股票行情)
  • 在线多人游戏
  • 多人协作编辑
  • IoT 设备通信等
二、什么是 SignalR?

SignalR 是微软开发的一个基于 .NET 的库,它简化了实时通信的实现。SignalR 内部封装了多种传输方式(包括 WebSocket、Server-Sent Events、长轮询等),并根据浏览器和网络环境自动选择最优的方式。
SignalR 特点:


  • 抽象了底层通信细节
  • 支持跨平台(.NET Core / .NET 6+)
  • 自动降级兼容性差的浏览器
  • 提供 Hub 模式,易于组织业务逻辑
  • 可集成到 ASP.NET Core 中
使用场景:


  • 快速构建实时功能(无需关注底层通信细节)
  • Web 应用中的通知系统
  • 即时通讯(IM)应用
  • 实时仪表盘、状态监控
三、WebSocket vs SignalR 对比

特性WebSocketSignalR通信方式全双工全双工(通过封装)是否需要手动处理连接✅ 需要❌ 不需要是否支持多路复用❌ 不支持✅ 支持(Hub)是否支持自动降级❌ 不支持✅ 支持(长轮询等)开发复杂度较高较低性能高略低于 WebSocket适合场景高性能、定制化通信快速开发、通用实时功能四、示例代码

示例 1:WebSocket 服务端 + 客户端(.NET)

服务端(控制台程序)
  1. using System;
  2. using System.Net;
  3. using System.Net.WebSockets;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. class Program
  8. {
  9.     static async Task Main(string[] args)
  10.     {
  11.         HttpListener listener = new HttpListener();
  12.         listener.Prefixes.Add("http://localhost:5000/");
  13.         listener.Start();
  14.         Console.WriteLine("WebSocket Server started on http://localhost:5000");
  15.         while (true)
  16.         {
  17.             HttpListenerContext context = await listener.GetContextAsync();
  18.             if (context.Request.IsWebSocketRequest)
  19.             {
  20.                 WebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
  21.                 _ = HandleWebSocketConnection(webSocketContext.WebSocket);
  22.             }
  23.             else
  24.             {
  25.                 context.Response.StatusCode = 400;
  26.                 context.Response.Close();
  27.             }
  28.         }
  29.     }
  30.     private static async Task HandleWebSocketConnection(WebSocket socket)
  31.     {
  32.         byte[] buffer = new byte[1024 * 4];
  33.         while (socket.State == WebSocketState.Open)
  34.         {
  35.             WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
  36.             string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
  37.             Console.WriteLine($"Received: {message}");
  38.             // Echo back the message
  39.             byte[] response = Encoding.UTF8.GetBytes($"Echo: {message}");
  40.             await socket.<input type="text" id="userInput" placeholder="User" />
  41. <input type="text" id="messageInput" placeholder="Message" />
  42. <button onclick="sendMessage()">Send</button>Async(new ArraySegment<byte>(response), WebSocketMessageType.Text, true, CancellationToken.None);
  43.         }
  44.     }
  45. }
复制代码
客户端(JavaScript)
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>WebSocket Client</title>
  5. </head>
  6. <body>
  7.     <input type="text" id="messageInput" placeholder="Enter message" />
  8.     <button onclick="sendMessage()"><input type="text" id="userInput" placeholder="User" />
  9. <input type="text" id="messageInput" placeholder="Message" />
  10. <button onclick="sendMessage()">Send</button></button>
  11.    
  12.    
  13. </body>
  14. </html>
复制代码
示例 2:SignalR 服务端 + 客户端(ASP.NET Core)

服务端(Startup.cs 或 Program.cs)
  1. var builder = WebApplication.CreateBuilder(args);
  2. // Add services to the container.
  3. builder.Services.AddSignalR();
  4. var app = builder.Build();
  5. app.MapHub<ChatHub>("/chatHub");
  6. app.Run();
  7. public class ChatHub : Hub
  8. {
  9.     public async Task <input type="text" id="userInput" placeholder="User" />
  10. <input type="text" id="messageInput" placeholder="Message" />
  11. <button onclick="sendMessage()">Send</button>(string user, string message)
  12.     {
  13.         await Clients.All.<input type="text" id="userInput" placeholder="User" />
  14. <input type="text" id="messageInput" placeholder="Message" />
  15. <button onclick="sendMessage()">Send</button>Async("ReceiveMessage", user, message);
  16.     }
  17. }
复制代码
客户端(JavaScript)
  1. <input type="text" id="userInput" placeholder="User" />
  2. <input type="text" id="messageInput" placeholder="Message" />
  3. <button onclick="sendMessage()">Send</button>
复制代码
五、总结

场景推荐技术高性能、低延迟、自定义协议WebSocket快速开发、通用实时功能SignalR浏览器兼容性要求高SignalR需要精细控制通信过程WebSocket如果你正在开发一个简单的聊天室或通知系统,SignalR 是更好的选择;而如果你需要构建一个高性能、低延迟的物联网通信系统,WebSocket 更合适
六、延伸阅读


  • Microsoft SignalR 文档
  • WebSocket W3C 标准文档
  • ASP.NET Core WebSocket 支持

希望这篇博客对你有所帮助!如果你有更多关于 C# 或实时通信的问题,欢迎留言交流
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册