C#怎么创建WebSocket通信

来源:网络学院作者:小宵头衔:网络博主
导读:本期聚焦于小伙伴创作的《C#怎么创建WebSocket通信》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么创建WebSocket通信》有用,将其分享出去将是对创作者最好的鼓励。

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

C#怎么创建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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。