一、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>
重用缓冲区 -
多线程处理高并发连接
-