# C#中怎么用WebSocket實現簡易聊天功能
## 目錄
1. [WebSocket技術概述](#websocket技術概述)
2. [環境準備與項目創建](#環境準備與項目創建)
3. [WebSocket服務端實現](#websocket服務端實現)
4. [WebSocket客戶端實現](#websocket客戶端實現)
5. [聊天室功能擴展](#聊天室功能擴展)
6. [安全性與異常處理](#安全性與異常處理)
7. [性能優化建議](#性能優化建議)
8. [完整代碼示例](#完整代碼示例)
9. [部署與測試](#部署與測試)
10. [總結與展望](#總結與展望)
---
## WebSocket技術概述
(約1200字)
### 傳統HTTP通信的局限性
- 輪詢效率低下問題
- 長連接的資源消耗
- 單向通信的限制
### WebSocket協議特點
```mermaid
sequenceDiagram
Client->>Server: HTTP Upgrade請求
Server->>Client: 101 Switching Protocols
Note right of Server: 全雙工通道建立
Client->>Server: 實時消息
Server->>Client: 即時響應
(約800字)
ChatApp/
├── Server/
│ ├── Program.cs
│ └── WebSocketMiddleware.cs
├── Client/
│ ├── Program.cs
│ └── ChatClient.cs
└── Shared/
└── MessageModel.cs
<!-- 服務端 -->
<PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
<!-- 客戶端 -->
<PackageReference Include="System.Net.WebSockets.Client" Version="5.0.1" />
(約2500字)
app.UseWebSockets(new WebSocketOptions
{
KeepAliveInterval = TimeSpan.FromMinutes(2)
});
public class WebSocketManager
{
private readonly ConcurrentDictionary<string, WebSocket> _sockets = new();
public async Task AddSocket(WebSocket socket)
{
var id = Guid.NewGuid().ToString();
_sockets.TryAdd(id, socket);
while (socket.State == WebSocketState.Open)
{
var buffer = new ArraySegment<byte>(new byte[1024]);
var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
// 消息廣播處理...
}
}
}
public async Task BroadcastAsync(string message)
{
foreach (var socket in _sockets.Values)
{
if (socket.State == WebSocketState.Open)
{
var bytes = Encoding.UTF8.GetBytes(message);
await socket.SendAsync(new ArraySegment<byte>(bytes),
WebSocketMessageType.Text,
true,
CancellationToken.None);
}
}
}
(約2000字)
using var ws = new ClientWebSocket();
await ws.ConnectAsync(new Uri("ws://localhost:5000/chat"), CancellationToken.None);
// 接收消息線程
var receiveTask = Task.Run(async () =>
{
var buffer = new byte[1024];
while (true)
{
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer),
CancellationToken.None);
Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, result.Count));
}
});
<!-- XAML界面 -->
<TextBox x:Name="txtMessage"/>
<Button Click="Send_Click">發送</Button>
<ListBox x:Name="lstMessages"/>
(約1800字)
public class ChatUser
{
public string ConnectionId { get; set; }
public string Username { get; set; }
public DateTime JoinTime { get; set; }
}
graph LR
A[客戶端A] -->|目標用戶ID| B[服務端]
B --> C[客戶端B]
services.AddSingleton<IMessageRepository, RedisMessageRepository>();
(約1500字)
try
{
// WebSocket操作
}
catch (WebSocketException ex)
{
logger.LogError($"WebSocket錯誤: {ex.WebSocketErrorCode}");
}
finally
{
await socket.CloseAsync(closeStatus,
"連接關閉",
CancellationToken.None);
}
(約1000字)
策略 | 優點 | 缺點 |
---|---|---|
固定大小 | 穩定 | 可能浪費資源 |
動態擴展 | 靈活 | 管理復雜 |
// 使用Memory<byte>代替byte[]
var memory = new Memory<byte>(buffer);
(約1200字)
[此處應包含完整的Program.cs和中間件代碼]
[包含控制臺和WPF兩個版本]
(約800字)
FROM mcr.microsoft.com/dotnet/aspnet:7.0
COPY /publish /app
WORKDIR /app
EXPOSE 80 443
ENTRYPOINT ["dotnet", "ChatServer.dll"]
并發用戶數 | 平均延遲 | 錯誤率
100 | 120ms | 0%
500 | 350ms | 0.2%
(約500字)
本文共約12,300字,完整代碼示例和詳細說明請參考配套GitHub倉庫。實際開發時建議根據具體需求調整實現方案。 “`
注:由于篇幅限制,這里展示的是文章的結構框架和部分內容示例。實際撰寫時需要: 1. 填充每個章節的詳細技術說明 2. 增加更多代碼注釋和示意圖 3. 補充性能測試數據 4. 添加參考文獻和擴展閱讀鏈接 5. 確保所有代碼示例經過實際驗證
需要我繼續擴展某個具體章節的內容嗎?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。