当前位置:首页 > C# > 正文

C# WebSocket客户端开发指南(从零开始实现WebSocket协议的客户端)

在现代Web和桌面应用中,实时通信已成为不可或缺的功能。而WebSocket协议正是实现双向、低延迟通信的核心技术之一。本文将手把手教你使用C#语言编写一个完整的WebSocket客户端,即使你是编程小白,也能轻松上手!

C# WebSocket客户端开发指南(从零开始实现WebSocket协议的客户端) WebSocket客户端  WebSocket协议实现 C#网络编程 实时通信C# 第1张

什么是WebSocket?

WebSocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP请求-响应模式不同,WebSocket允许服务器主动向客户端推送数据,非常适合聊天应用、实时股票行情、在线游戏等场景。

准备工作

在C#中实现WebSocket客户端,我们推荐使用.NET内置的 ClientWebSocket 类(位于 System.Net.WebSockets 命名空间)。该类自 .NET Core 2.1 起就已支持,无需额外安装NuGet包。

第一步:创建控制台项目

打开Visual Studio或使用命令行创建一个新控制台项目:

dotnet new console -n MyWebSocketClientcd MyWebSocketClient

第二步:编写WebSocket客户端代码

Program.cs 文件中,替换为以下完整代码:

using System;using System.Net.WebSockets;using System.Text;using System.Threading;using System.Threading.Tasks;namespace MyWebSocketClient{    class Program    {        static async Task Main(string[] args)        {            // 创建WebSocket客户端实例            using var client = new ClientWebSocket();            try            {                // 连接到WebSocket服务器(这里以公共测试服务器为例)                await client.ConnectAsync(new Uri("wss://echo.websocket.org"), CancellationToken.None);                Console.WriteLine("✅ 已成功连接到WebSocket服务器!");                // 启动接收消息的任务                _ = ReceiveMessages(client);                // 发送消息循环                while (client.State == WebSocketState.Open)                {                    Console.Write("请输入要发送的消息(输入'exit'退出): ");                    string? message = Console.ReadLine();                    if (message?.ToLower() == "exit")                        break;                    if (!string.IsNullOrWhiteSpace(message))                    {                        byte[] buffer = Encoding.UTF8.GetBytes(message);                        await client.SendAsync(                            new ArraySegment<byte>(buffer),                            WebSocketMessageType.Text,                            true,                            CancellationToken.None);                        Console.WriteLine($"📤 已发送: {message}");                    }                }            }            catch (Exception ex)            {                Console.WriteLine($"❌ 连接失败: {ex.Message}");            }            finally            {                if (client.State == WebSocketState.Open)                {                    await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭", CancellationToken.None);                }                Console.WriteLine("🔌 WebSocket连接已关闭。");            }        }        static async Task ReceiveMessages(ClientWebSocket client)        {            var buffer = new byte[1024 * 4]; // 4KB缓冲区            while (client.State == WebSocketState.Open)            {                try                {                    var result = await client.ReceiveAsync(                        new ArraySegment<byte>(buffer),                        CancellationToken.None);                    if (result.MessageType == WebSocketMessageType.Close)                    {                        await client.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);                        break;                    }                    string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);                    Console.WriteLine($"📥 收到消息: {receivedMessage}");                }                catch (Exception ex)                {                    Console.WriteLine($"⚠️ 接收消息时出错: {ex.Message}");                    break;                }            }        }    }}

第三步:运行并测试

在终端中执行:

dotnet run

程序启动后会连接到 wss://echo.websocket.org(这是一个回显测试服务器,会原样返回你发送的消息)。你可以输入任意文本进行测试,输入 exit 退出程序。

关键知识点解析

  • C# WebSocket客户端 使用 ClientWebSocket 类实现,它是线程安全的。
  • 所有操作都是异步的(async/await),避免阻塞主线程。
  • 接收消息需在一个独立任务中循环监听,否则会错过服务器推送。
  • 记得在程序结束前调用 CloseAsync 正确关闭连接,释放资源。

常见问题与优化建议

1. 连接超时:可在 ConnectAsync 中传入带超时的 CancellationToken

2. 重连机制:生产环境中应添加自动重连逻辑,应对网络波动。

3. 消息分片处理:上述代码假设消息较小,若处理大消息,需检查 result.EndOfMessage 是否为 false 并拼接分片。

结语

通过本教程,你已经掌握了如何用C#实现一个基础但功能完整的WebSocket协议实现。这项技能是构建现代实时通信C#应用的基石。无论是开发聊天系统、物联网设备通信,还是金融数据推送,你都可以在此基础上扩展功能。

记住,C#网络编程的世界远不止于此,继续探索吧!