1. 简介 WebSocket-sharp 是一个功能强大的 C# WebSocket 库,支持 WebSocket 客户端和服务器端的实现。它具有以下主要特性:
2. 安装方式 2.1 手动构建 使用 MonoDevelop 打开 websocket-sharp.sln
构建 websocket-sharp 项目
将生成的 websocket-sharp.dll 添加到你的项目引用中
2.2 NuGet 安装
使用 NuGet Package Manager Console:
PM> Install-Package WebSocketSharp.core
3. 客户端实现 3.1 基础客户端示例 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}" ); } } } }
3.2 带安全连接的客户端示例 using System.Security.Cryptography.X509Certificates; var ws = new WebSocket( "wss://example.com" ); // 设置服务器证书验证 ws.SslConfiguration.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { // 在这里进行证书验证逻辑 return true ; // 返回 true 表示证书有效 };
3.3 带认证的客户端示例 var ws = new WebSocket( "ws://example.com" ); ws.SetCredentials( "username" , "password" , true );
4. 服务器端实现 4.1 基础服务器示例 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(); } }
4.2 聊天室服务器示例 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( "服务器已停止" ); } } }
客户端 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(); } } } }
4.3 带安全连接的服务器示例 var wssv = new WebSocketServer( 4649 , true ); // true 表示使用 SSL wssv.SslConfiguration.ServerCertificate = new X509Certificate2( "/path/to/cert.pfx" , "password" );
5. 高级特性 5.1 消息压缩 // 客户端启用压缩 ws.Compression = CompressionMethod.Deflate; // 服务器端忽略压缩请求 public class CompressIgnoredService : WebSocketBehavior { public CompressIgnoredService () { IgnoreExtensions = true ; } }
5.2 HTTP 代理支持 var ws = new WebSocket( "ws://example.com" ); ws.SetProxy( "http://proxy.example.com:3128" , "username" , "password" );
5.3 Cookie 处理 // 客户端设置 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 日志记录 // 设置日志级别 ws.Log.Level = LogLevel.Debug; // 输出日志 ws.Log.Debug( "调试信息" ); ws.Log.Info( "普通信息" ); ws.Log.Error( "错误信息" );
6. 结语 WebSocket-sharp 提供了丰富的功能和灵活的 API,使其成为构建实时通信应用的理想选择。通过本指南的示例,你可以快速开始使用 WebSocket-sharp 开发各类 WebSocket 应用。
记住要经常查看 官方文档 以获取最新更新和详细信息。
https://github.com/sta/websocket-sharp
该文章在 2024/12/2 9:52:48 编辑过