一、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>
?重用緩沖區 -
多線程處理高并發連接
-