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");
}
五、运行测试步骤
-
启动服务端
dotnet run
-
运行客户端
客户端控制台输出:已连接到服务端 收到回复: Hello, WebSocket!
六、核心 API 说明
方法/属性 | 说明 |
---|---|
AcceptWebSocketAsync() | 服务端接受 WebSocket 连接请求 |
SendAsync() | 发送消息(支持文本和二进制数据) |
ReceiveAsync() | 异步接收消息 |
CloseAsync() | 正常关闭连接 |
WebSocketMessageType.Text | 指定消息类型为文本 |
七、注意事项
-
跨域问题
在 ASP.NET Core 中配置 CORS:services.AddCors(options => options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()));
-
心跳检测
添加心跳机制防止连接超时:webSocket.Options.KeepAliveInterval = TimeSpan.FromSeconds(30);
-
异常处理
使用try-catch
捕获WebSocketException
:try {// WebSocket 操作代码 } catch (WebSocketException ex) {Console.WriteLine($"连接异常: {ex.Message}"); }
-
性能优化
-
使用
ArrayPool<byte>
重用缓冲区 -
多线程处理高并发连接
-