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 编辑过