编辑
2025-10-09
C#
00

目录

简介
安装方式
手动构建
NuGet 安装
3. 客户端实现
3.1 基础客户端示例
3.2 带安全连接的客户端示例
3.3 带认证的客户端示例
4. 服务器端实现
4.1 基础服务器示例
4.2 聊天室服务器示例
客户端
4.3 带安全连接的服务器示例
5. 高级特性
5.1 消息压缩
5.2 HTTP 代理支持
5.3 Cookie 处理
5.4 日志记录
6. 结语

简介

WebSocket-sharp 是一个功能强大的 C# WebSocket 库,支持 WebSocket 客户端和服务器端的实现。它具有以下主要特性:

  • 完全支持 RFC 6455 协议规范
  • 支持客户端和服务器端实现
  • 支持消息压缩扩展
  • 支持安全连接(SSL/TLS)
  • 支持 HTTP 认证
  • 支持查询字符串、Origin 头和 Cookies
  • 支持 HTTP 代理服务器连接
  • 支持 .NET Framework 3.5 及更高版本

安装方式

手动构建

  1. 使用 MonoDevelop 打开 websocket-sharp.sln
  2. 构建 websocket-sharp 项目
  3. 将生成的 websocket-sharp.dll 添加到你的项目引用中

NuGet 安装

使用 NuGet Package Manager Console:

PowerShell
PM> Install-Package WebSocketSharp.core

image.png

3. 客户端实现

3.1 基础客户端示例

C#
internal class Program { static void Main() { using (var ws = new WebSocket("ws://127.0.0.1:4649/echo")) { // 连接建立时的处理 ws.OnOpen += (sender, e) => { Console.WriteLine("连接已建立"); }; // 接收消息的处理 ws.OnMessage += (sender, e) => { Console.WriteLine($"收到服务器消息: {e.Data}"); }; // 发生错误时的处理 ws.OnError += (sender, e) => { Console.WriteLine($"发生错误: {e.Message}"); }; // 连接关闭时的处理 ws.OnClose += (sender, e) => { Console.WriteLine($"连接关闭: {e.Code} {e.Reason}"); }; try { // 连接到服务器 ws.Connect(); // 等待连接建立 Thread.Sleep(1000); if (ws.ReadyState == WebSocketState.Open) { Console.WriteLine("正在发送消息..."); ws.Send("Hello Server!"); // 保持连接一段时间以接收响应 Thread.Sleep(1000); } else { Console.WriteLine("连接未就绪,当前状态: " + ws.ReadyState); } Console.WriteLine("按任意键退出..."); Console.ReadKey(true); } catch (Exception ex) { Console.WriteLine($"发生异常: {ex.Message}"); } } } }

image.png

3.2 带安全连接的客户端示例

C#
using System.Security.Cryptography.X509Certificates; var ws = new WebSocket("wss://example.com"); // 设置服务器证书验证 ws.SslConfiguration.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { // 在这里进行证书验证逻辑 return true; // 返回 true 表示证书有效 };

3.3 带认证的客户端示例

C#
var ws = new WebSocket("ws://example.com"); ws.SetCredentials("username", "password", true);

4. 服务器端实现

4.1 基础服务器示例

C#
public class Echo : WebSocketBehavior { protected override void OnOpen() { Console.WriteLine("客户端已连接"); } protected override void OnMessage(MessageEventArgs e) { Console.WriteLine($"服务器收到消息: {e.Data}"); Send(e.Data); // 回显消息 } protected override void OnClose(CloseEventArgs e) { Console.WriteLine("客户端已断开连接"); } protected override void OnError(ErrorEventArgs e) { Console.WriteLine($"服务器端错误: {e.Message}"); } } class Program { static void Main() { // 创建 WebSocket 服务器 var wssv = new WebSocketServer("ws://0.0.0.0:4649"); // 添加 WebSocket 服务 wssv.AddWebSocketService<Echo>("/echo"); // 启动服务器 wssv.Start(); Console.WriteLine("WebSocket 服务器已启动在 ws://0.0.0.0:4649/echo"); Console.WriteLine("按任意键停止服务器..."); Console.ReadKey(true); // 停止服务器 wssv.Stop(); } }

image.png

4.2 聊天室服务器示例

C#
using WebSocketSharp.Server; using WebSocketSharp; using ErrorEventArgs = WebSocketSharp.ErrorEventArgs; namespace AppChatServer { // 聊天室处理类 public class ChatRoom : WebSocketBehavior { private static Dictionary<string, string> _users = new Dictionary<string, string>(); private string _nickname; protected override void OnOpen() { // 从 Context.QueryString 获取昵称 var queryString = Context.QueryString; _nickname = queryString["nickname"] ?? $"Anonymous_{GetRandomString(4)}"; lock (_users) { _users[ID] = _nickname; } Console.WriteLine($"新用户加入: {_nickname}"); Sessions.Broadcast($"{_nickname} 加入了聊天室"); // 发送当前在线用户列表 var userList = string.Join(", ", _users.Values); Sessions.Broadcast($"当前在线用户: {userList}"); } protected override void OnMessage(MessageEventArgs e) { Console.WriteLine($"收到消息 from {_nickname}: {e.Data}"); Sessions.Broadcast($"{_nickname}: {e.Data}"); } protected override void OnClose(CloseEventArgs e) { lock (_users) { _users.Remove(ID); } Console.WriteLine($"用户离开: {_nickname}"); Sessions.Broadcast($"{_nickname} 离开了聊天室"); // 更新在线用户列表 var userList = string.Join(", ", _users.Values); Sessions.Broadcast($"当前在线用户: {userList}"); } protected override void OnError(ErrorEventArgs e) { Console.WriteLine($"发生错误 ({_nickname}): {e.Message}"); } private string GetRandomString(int length) { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random = new Random(); return new string(Enumerable.Repeat(chars, length) .Select(s => s[random.Next(s.Length)]).ToArray()); } } // 服务器主程序 class Program { static void Main() { // 创建 WebSocket 服务器 var wssv = new WebSocketServer("ws://0.0.0.0:4649"); // 添加聊天室服务 wssv.AddWebSocketService<ChatRoom>("/chat"); // 启动服务器 wssv.Start(); Console.WriteLine("聊天室服务器已启动在 ws://0.0.0.0:4649/chat"); Console.WriteLine("按任意键停止服务器..."); Console.ReadKey(true); // 停止服务器 wssv.Stop(); Console.WriteLine("服务器已停止"); } } }

客户端

C#
using WebSocketSharp; namespace AppChatClient { class Program { static void Main() { Console.Write("请输入你的昵称: "); string nickname = Console.ReadLine()?.Trim() ?? "Anonymous"; // 创建WebSocket连接,包含昵称参数 using (var ws = new WebSocket($"ws://127.0.0.1:4649/chat?nickname={Uri.EscapeDataString(nickname)}")) { bool isConnected = false; // 连接建立时的处理 ws.OnOpen += (sender, e) => { isConnected = true; Console.WriteLine("已连接到聊天室"); Console.WriteLine("输入消息按回车发送,输入 'exit' 退出"); }; // 接收消息的处理 ws.OnMessage += (sender, e) => { Console.WriteLine(e.Data); }; // 发生错误时的处理 ws.OnError += (sender, e) => { Console.WriteLine($"错误: {e.Message}"); }; // 连接关闭时的处理 ws.OnClose += (sender, e) => { isConnected = false; Console.WriteLine($"连接已关闭: {e.Code} {e.Reason}"); }; try { // 连接到服务器 ws.Connect(); // 消息发送循环 while (isConnected) { string message = Console.ReadLine() ?? ""; if (message.ToLower() == "exit") break; if (!string.IsNullOrEmpty(message) && ws.ReadyState == WebSocketState.Open) { ws.Send(message); } } // 正常关闭连接 if (ws.ReadyState == WebSocketState.Open) { ws.Close(CloseStatusCode.Normal); } } catch (Exception ex) { Console.WriteLine($"发生异常: {ex.Message}"); } Console.WriteLine("按任意键退出..."); Console.ReadKey(); } } } }

image.png

4.3 带安全连接的服务器示例

C#
var wssv = new WebSocketServer(4649, true); // true 表示使用 SSL wssv.SslConfiguration.ServerCertificate = new X509Certificate2("/path/to/cert.pfx", "password");

5. 高级特性

5.1 消息压缩

C#
// 客户端启用压缩 ws.Compression = CompressionMethod.Deflate; // 服务器端忽略压缩请求 public class CompressIgnoredService : WebSocketBehavior { public CompressIgnoredService() { IgnoreExtensions = true; } }

5.2 HTTP 代理支持

C#
var ws = new WebSocket("ws://example.com"); ws.SetProxy("http://proxy.example.com:3128", "username", "password");

5.3 Cookie 处理

C#
// 客户端设置 Cookie ws.SetCookie(new Cookie("session", "abc123")); // 服务器端验证 Cookie wssv.AddWebSocketService<ChatRoom>("/chat", service => { service.CookiesValidator = (req, res) => { var sessionCookie = req["session"]; return sessionCookie != null && ValidateSession(sessionCookie.Value); }; });

5.4 日志记录

C#
// 设置日志级别 ws.Log.Level = LogLevel.Debug; // 输出日志 ws.Log.Debug("调试信息"); ws.Log.Info("普通信息"); ws.Log.Error("错误信息");

6. 结语

WebSocket-sharp 提供了丰富的功能和灵活的 API,使其成为构建实时通信应用的理想选择。通过本指南的示例,你可以快速开始使用 WebSocket-sharp 开发各类 WebSocket 应用。

记住要经常查看官方文档以获取最新更新和详细信息。

HTML
https://github.com/sta/websocket-sharp

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!