编辑
2025-02-15
C# 应用
00
请注意,本文编写于 80 天前,最后修改于 80 天前,其中某些信息可能已经过时。

目录

简介
安装方式
手动构建
NuGet 安装
客户端实现
基础客户端示例
带安全连接的客户端示例
带认证的客户端示例
服务器端实现
基础服务器示例
聊天室服务器示例
客户端
带安全连接的服务器示例
高级特性
消息压缩
HTTP 代理支持
Cookie 处理
日志记录
结语

简介

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

客户端实现

基础客户端示例

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

带安全连接的客户端示例

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

带认证的客户端示例

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

服务器端实现

基础服务器示例

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

聊天室服务器示例

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

带安全连接的服务器示例

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

高级特性

消息压缩

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

HTTP 代理支持

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

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); }; });

日志记录

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

结语

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

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

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

本文作者:rick

本文链接:

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