在C#中实现WebSocket通信可以满足实时消息推送、在线聊天、实时数据同步等场景的需求,下面以ASP.NET Core环境为例,讲解完整的WebSocket通信开发流程。

WebSocket通信基础概念
WebSocket是一种在单个TCP连接上进行全双工通信的协议,相比传统的HTTP轮询,它能减少不必要的网络开销,实现服务端和客户端的实时双向数据传输。在C#中,我们可以通过内置的System.Net.WebSockets命名空间提供的类来实现WebSocket功能。
搭建WebSocket服务端
首先我们需要创建一个ASP.NET Core项目,然后在项目中配置WebSocket中间件,处理客户端的连接请求和消息交互。
1. 配置WebSocket中间件
在Program.cs中添加WebSocket中间件配置,代码如下:
using System.Net.WebSockets;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 启用WebSocket中间件
app.UseWebSockets();
// 处理WebSocket请求
app.Map("/ws", async (HttpContext context) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
// 接受WebSocket连接
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
await HandleWebSocketAsync(webSocket);
}
else
{
context.Response.StatusCode = 400;
}
});
app.Run();
// 处理WebSocket连接的核心逻辑
static async Task HandleWebSocketAsync(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
// 将接收到的字节转换为字符串
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"接收到客户端消息: {receivedMessage}");
// 构造响应消息
string responseMessage = $"服务端已收到消息: {receivedMessage}";
byte[] responseBytes = Encoding.UTF8.GetBytes(responseMessage);
// 发送响应消息给客户端
await webSocket.SendAsync(new ArraySegment<byte>(responseBytes), result.MessageType, result.EndOfMessage, CancellationToken.None);
// 继续接收下一条消息
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
// 关闭连接
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
2. 服务端逻辑说明
上述代码中,我们首先通过app.UseWebSockets()启用WebSocket支持,然后映射了/ws路径处理WebSocket请求。当客户端发起WebSocket连接时,服务端接受连接后进入消息处理循环,不断接收客户端发送的消息,并返回对应的响应,直到连接关闭。
创建WebSocket客户端
客户端我们可以使用C#的控制台程序来实现,通过ClientWebSocket类发起连接并收发消息。
客户端实现代码
创建控制台项目,添加以下代码:
using System.Net.WebSockets;
using System.Text;
var clientWebSocket = new ClientWebSocket();
try
{
// 连接服务端WebSocket地址
await clientWebSocket.ConnectAsync(new Uri("ws://localhost:5000/ws"), CancellationToken.None);
Console.WriteLine("已连接到WebSocket服务端");
// 启动接收消息的任务
var receiveTask = Task.Run(async () =>
{
var buffer = new byte[1024 * 4];
while (clientWebSocket.State == WebSocketState.Open)
{
WebSocketReceiveResult result = await clientWebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"接收到服务端消息: {message}");
}
});
// 发送消息给服务端
while (true)
{
Console.Write("请输入要发送的消息(输入exit退出): ");
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
byte[] sendBytes = Encoding.UTF8.GetBytes(input);
await clientWebSocket.SendAsync(new ArraySegment<byte>(sendBytes), WebSocketMessageType.Text, true, CancellationToken.None);
}
// 关闭连接
await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭连接", CancellationToken.None);
await receiveTask;
}
catch (Exception ex)
{
Console.WriteLine($"发生异常: {ex.Message}");
}
finally
{
clientWebSocket.Dispose();
}
运行测试
首先启动服务端项目,然后启动客户端项目,在客户端控制台输入消息并回车,就可以看到服务端接收消息并返回响应,客户端也能收到服务端的回复,实现双向实时通信。如果需要处理更复杂的场景,比如多客户端连接管理、消息广播等,可以在服务端的HandleWebSocketAsync方法中添加对应的逻辑,维护所有连接的WebSocket实例即可。
注意事项
- 生产环境中需要添加异常处理和重连机制,避免网络波动导致连接断开后无法恢复。
- 如果需要传输较大的数据,需要分片处理,避免单次传输超出缓冲区大小。
- WebSocket连接默认是无状态的,如果需要用户身份识别,可以在连接建立时通过查询参数传递身份令牌,服务端进行校验。
C#WebSocket实时通信ASP.NET_Core修改时间:2026-07-06 21:24:25