【C#】WebSoket 演示(使用websocket-sharp库)

打印 上一主题 下一主题

主题 797|帖子 797|积分 2391



Example 3服务器+ Example1 客户端
示例3

此源代码片断包罗了如何使用WebSocketSharp库来创建一个HTTP服务器,并提供WebSocket服务。 分析整个代码,我们可以归纳出以下关键信息:

  • 导入了一系列告急的定名空间,包括系统配置、加密库、文本、WebSocket等。
  • 定义了Example3名称空间和包罗Main方法的Program类,作为HTTP服务器和WebSocket服务的入口点。
  • HTTP服务器使用4649端口实例化,同时解释掉的代码展示了其他可能的方式来实例化HTTP服务器(包括带安全连接的https,以及监听差异网络所在和端口的服务器实例)。
  • 当服务器运行在DEBUG模式下,可以设置日志级别、相应等候时间以及清算策略。
  • 解释掉的代码示例分析了如何设置服务器的SSL配置,以及如何设置基本或择要型的HTTP身份验证。
  • 服务器利用HttpServer.DocumentRootPath设置了文档根目录路径。
  • 通过OnGet变乱处理步伐来处理HTTP GET请求,可以读取文件并根据文件内容类型设置相应头和正文。
  • 服务器添加了Echo和Chat两个WebSocket服务。
  • 解释掉的代码中包括了WebSocket服务的具体初始化示例,比方设置协议、校验器和对服务器发送的Cookie进行校验等。
  • 服务器启动并开始监听,在控制台上显示一些运行信息。
  • 末了,通过读取输入来停止HTTP服务器
综上所述,本段代码提供了使用WebSocketSharp库创建符合个人必要的HTTP服务器与WebSocket服务的多种示例和配置方法。通过此代码,可以开启一个支持WebSocket通信的服务器,并可通过相关配置来实现安全连接、HTTP认证和基于文档根路径的内容服务能力。

App.config文件
下面代码初始化一个**基于WebSocketSharp库的WebSocket服务器,它允许客户端通过WebSocket协议连接进行通信,并提供HTTP服务,可以相应基于HTTP的GET请求。提供静态文件服务和WebSocket回显(Echo)/谈天(Chat)服务。**支持通过差异方式指定服务的所在和端口,包罗了调试模式下的日志品级设置,以及生产模式下的SSL/TLS证书配置和HTTP认证机制的配置,但这些功能默认是被解释掉的。服务器通过控制台命令启动和停止,并能在控制台输出当前服务的状态信息。
  1. using System; // 引入System命名空间
  2. using System.Configuration; // 引入System.Configuration命名空间,用于访问配置文件
  3. using System.Security.Cryptography.X509Certificates; // 引入System.Security.Cryptography.X509Certificates命名空间,用于处理证书
  4. using System.Text; // 引入System.Text命名空间,包含编码和字符集的功能
  5. using WebSocketSharp; // 引入WebSocketSharp命名空间,一个实现WebSocket协议的C#库
  6. using WebSocketSharp.Net; // 引入WebSocketSharp.Net命名空间,提供网络相关的功能
  7. using WebSocketSharp.Server; // 引入WebSocketSharp.Server命名空间,用于创建和管理WebSocket服务器
  8. // 定义了一个名为Example3的命名空间
  9. namespace Example3
  10. {
  11.   // 定义了一个Program类
  12.   public class Program
  13.   {
  14.     // 主函数
  15.     public static void Main (string[] args)
  16.     {
  17.       // 创建HttpServer类的新实例。
  18.       //
  19.       // 如果需要提供安全连接(即HTTPS),应使用带有'secure'参数设置为true
  20.       // 或者带有https协议的HTTP URL来创建新实例。
  21.       var httpsv = new HttpServer (4649); // 在4649端口上实例化HttpServer
  22.       // var httpsv = new HttpServer (5963, true); // 使用SSL在5963端口上实例化HttpServer(代码暂时被注释)
  23.       // 下面的被注释的代码块展示了其他创建HttpServer实例的方式。
  24.       // 例如绑定到所有IP地址、绑定到IPv6地址、通过具体IP实例化等等。
  25.       /*注释掉的代码展示了多种不同的方法来创建HttpServer的实例,包括监听不同的网络接口(所有网络、IPv4回环地址、IPv6回环地址)、监听不同的端口(常规端口、安全端口)、以及支持安全连接(SSL/TLS)。代码被注释意味着虽然是可用的选项,但当前不是活动状态。这些代码为开发者提供了灵活性,在不同场景下快速调整服务器监听的网络接口和端口。*/
  26.       // 使用SSL,在5963端口上创建一个支持安全连接的HttpServer实例(代码被注释)
  27.         // var httpsv = new HttpServer (5963, true);
  28.         // 在所有网络接口的4649端口上创建HttpServer实例(代码被注释)
  29.         // var httpsv = new HttpServer (System.Net.IPAddress.Any, 4649);
  30.         // 在所有网络接口的5963端口上创建支持SSL的HttpServer实例(代码被注释)
  31.         // var httpsv = new HttpServer (System.Net.IPAddress.Any, 5963, true);
  32.         // 在所有IPv6地址的4649端口上创建HttpServer实例(代码被注释)
  33.         // var httpsv = new HttpServer (System.Net.IPAddress.IPv6Any, 4649);
  34.          // 在所有IPv6地址的5963端口上创建支持SSL的HttpServer实例(代码被注释)
  35.         // var httpsv = new HttpServer (System.Net.IPAddress.IPv6Any, 5963, true);
  36.          // 通过HTTP协议,在所有网络接口的4649端口上创建HttpServer实例(代码被注释)
  37.         // var httpsv = new HttpServer ("http://0.0.0.0:4649");
  38.         // 通过HTTPS协议,在所有网络接口的5963端口上创建HttpServer实例(代码被注释)
  39.         // var httpsv = new HttpServer ("https://0.0.0.0:5963");
  40.         // 通过HTTP协议,在所有IPv6地址的4649端口上创建HttpServer实例(代码被注释)
  41.         // var httpsv = new HttpServer ("http://[::0]:4649");
  42.         // 通过HTTPS协议,在所有IPv6地址的5963端口上创建HttpServer实例(代码被注释)
  43.         // var httpsv = new HttpServer ("https://[::0]:5963");
  44.         // 在回环接口(localhost)的4649端口上创建HttpServer实例(代码被注释)
  45.         // var httpsv = new HttpServer (System.Net.IPAddress.Loopback, 4649);
  46.         // 在回环接口(localhost)的5963端口上创建支持SSL的HttpServer实例(代码被注释)
  47.         // var httpsv = new HttpServer (System.Net.IPAddress.Loopback, 5963, true);
  48.         // 在IPv6回环接口(localhost)的4649端口上创建HttpServer实例(代码被注释)
  49.         // var httpsv = new HttpServer (System.Net.IPAddress.IPv6Loopback, 4649);
  50.         // 在IPv6回环接口(localhost)的5963端口上创建支持SSL的HttpServer实例(代码被注释)
  51.         // var httpsv = new HttpServer (System.Net.IPAddress.IPv6Loopback, 5963, true);
  52.         // 通过HTTP协议,在localhost的4649端口上创建HttpServer实例(代码被注释)
  53.         // var httpsv = new HttpServer ("http://localhost:4649");
  54.         // 通过HTTPS协议,在localhost的5963端口上创建HttpServer实例(代码被注释)
  55.         // var httpsv = new HttpServer ("https://localhost:5963");
  56.         // 通过HTTP协议,在127.0.0.1(IPv4回环地址)的4649端口上创建HttpServer实例(代码被注释)
  57.         // var httpsv = new HttpServer ("http://127.0.0.1:4649");
  58.          // 通过HTTPS协议,在127.0.0.1(IPv4回环地址)的5963端口上创建HttpServer实例(代码被注释)
  59.         // var httpsv = new HttpServer ("https://127.0.0.1:5963");
  60.         // 通过HTTP协议,在[::1](IPv6回环地址)的4649端口上创建HttpServer实例(代码被注释)
  61.         // var httpsv = new HttpServer ("http://[::1]:4649");
  62.         // 通过HTTPS协议,在[::1](IPv6回环地址)的5963端口上创建HttpServer实例(代码被注释)
  63.         // var httpsv = new HttpServer ("https://[::1]:5963");
  64. #if DEBUG
  65.       // 若是处于DEBUG模式,以下参数会被设置。
  66.       httpsv.Log.Level = LogLevel.Trace; // 日志级别被设置为Trace
  67.       // 以下是在DEBUG模式下可能会设置的其他参数。
  68.        // 更改响应WebSocket Ping或Close的等待时间为2秒(代码被注释)
  69.       // httpsv.WaitTime = TimeSpan.FromSeconds (2);
  70.       // httpsv.KeepClean = false; // 不定期移除不活跃的WebSocket会话(代码被注释)
  71. #endif
  72.         /*被注释掉的代码展示了如何对HttpServer实例进行配置,包括配置安全连接(设置服务器证书)、提供HTTP认证(设置认证方案,用户凭证查找函数)以及解决等待处于TIME_WAIT状态的套接字的问题。被注释意味着这些配置在当前不被应用,这些代码为开发者提供了灵活性,在不同场景下快速调整服务器的配置。*/
  73.       // 若要启用具有安全性的连接(SSL/TLS),需要取消以下部分的注释,
  74.       // 并指定服务器证书的路径与密码。
  75.         // 提供安全连接
  76.         /*
  77.         var cert = ConfigurationManager.AppSettings["ServerCertFile"]; // 获取服务器证书文件路径
  78.         var passwd = ConfigurationManager.AppSettings["CertFilePassword"]; // 获取服务器证书文件密码
  79.         httpsv.SslConfiguration.ServerCertificate = new X509Certificate2 (cert, passwd); // 创建X509证书实例并设置为服务器证书(代码段被注释)
  80.         */
  81.         // 提供HTTP认证(基础认证/摘要认证)
  82.         /*
  83.         httpsv.AuthenticationSchemes = AuthenticationSchemes.Basic; // 设置认证方案为基础认证
  84.         httpsv.Realm = "WebSocket Test"; // 设置领域/域名为"WebSocket Test"
  85.         httpsv.UserCredentialsFinder = id => {
  86.             var name = id.Name; // 获取用户名
  87.             // 返回用户名、密码以及角色
  88.             return name == "nobita"
  89.                 ? new NetworkCredential (name, "password", "gunfighter")
  90.                 : null; // 如果找不到用户的凭证,则返回null(代码段被注释)
  91.         };
  92.         */
  93.         // 解决等待处于TIME_WAIT状态的套接字问题
  94.         // httpsv.ReuseAddress = true; // 设置可重用地址(代码被注释)
  95.       // 设置文档根路径。
  96.       httpsv.DocumentRootPath = ConfigurationManager.AppSettings["DocumentRootPath"];
  97.       // 设置HTTP GET请求处理事件。
  98.         httpsv.OnGet += (sender, e) => { // 为httpsv实例的OnGet事件绑定一个事件处理程序
  99.             var req = e.Request; // 获取请求对象
  100.             var res = e.Response; // 获取响应对象
  101.             var path = req.RawUrl; // 获取请求的RawUrl属性,即原始请求路径
  102.             if (path == "/") // 如果请求路径是根目录
  103.             path += "index.html"; // 则将路径改为"index.html"
  104.             byte[] contents; // 定义一个字节数组来存放文件内容
  105.             if (!e.TryReadFile (path, out contents)) { // 尝试读取指定路径的文件内容到contents数组中
  106.             res.StatusCode = (int) HttpStatusCode.NotFound; // 如果文件不存在,设置响应状态码为404(未找到)
  107.             return; // 结束事件处理
  108.             }
  109.             // 以下根据请求文件的类型设置Content-Type响应头
  110.             if (path.EndsWith(".html")) { // 如果文件是HTML文件
  111.             res.ContentType = "text/html"; // 设置响应内容类型为text/html
  112.             res.ContentEncoding = Encoding.UTF8; // 设置响应内容的编码为UTF-8
  113.             }
  114.             else if (path.EndsWith(".js")) { // 如果文件是JavaScript文件
  115.             res.ContentType = "application/javascript"; // 设置响应内容类型为application/javascript
  116.             res.ContentEncoding = Encoding.UTF8; // 同样设置编码为UTF-8
  117.             }
  118.             res.ContentLength64 = contents.LongLength; // 设置响应内容的长度
  119.             res.Close(contents, true); // 将内容发送给客户端并关闭响应
  120.         };
  121.       // 添加WebSocket服务。
  122.       httpsv.AddWebSocketService<Echo> ("/Echo"); // 添加Echo服务
  123.       httpsv.AddWebSocketService<Chat> ("/Chat"); // 添加Chat服务
  124.       // WebSocket服务的初始化(如果需要初始化参数)。下面的多个注释代码块用于配置服务。
  125.       httpsv.Start(); // 启动HttpServer
  126.       // 如果服务器已经开始监听,则输出一些基本的服务信息。
  127.       if (httpsv.IsListening) {
  128.         Console.WriteLine ("Listening on port {0}, and providing WebSocket services:", httpsv.Port);
  129.         foreach (var path in httpsv.WebSocketServices.Paths)
  130.           Console.WriteLine ("- {0}", path); // 输出提供服务的路径
  131.       }
  132.       Console.WriteLine ("
  133. Press Enter key to stop the server..."); // 提示按下回车停止服务器
  134.       Console.ReadLine (); // 等待用户输入
  135.       httpsv.Stop (); // 停止HttpServer
  136.     }
  137.   }
  138. }
复制代码
启动服务:
  1. Listening on port 4649, and providing WebSocket services:
  2. - /Echo
  3. - /Chat
  4. Press Enter key to stop the server...
复制代码
下面代码定义了一个名为Chat的类,该类继续自WebSocketBehavior类,用于处理WebSocket服务器的一个谈天服务。在新的WebSocket连接建立时获取用户名,并向所有已连上的会话广播该用户已上线的消息。当收到消息时,将该用户的用户名和消息内容进行拼装,并广播给所有已连上的会话。当WebSocket连接断开时,广播该用户已下线的消息。整个Chat类就是一个简朴的谈天室服务的实现。
  1. using System; // 引用System命名空间
  2. using System.Threading; // 引用System.Threading命名空间,提供多线程相关的功能
  3. using WebSocketSharp; // 引用WebSocketSharp命名空间,一个实现WebSocket协议的C#库
  4. using WebSocketSharp.Server; // 引用WebSocketSharp.Server命名空间,用于创建和管理WebSocket服务器
  5. // 定义Example3名字空间
  6. namespace Example3
  7. {
  8.   // 定义公共类Chat,继承自WebSocketBehavior
  9.   public class Chat : WebSocketBehavior
  10.   {
  11.     private string _name; // 私有字符串变量,表示聊天的用户名
  12.     private static int _number = 0; // 私有静态整型变量,与用户名关联
  13.     private string _prefix; // 私有字符串变量,表示用户名前缀
  14.     // 构造函数
  15.     public Chat ()
  16.     {
  17.       _prefix = "anon#"; // 默认的用户名前缀是“anon#”
  18.     }
  19.     // Prefix 属性的get和set方法
  20.     public string Prefix {
  21.       get {
  22.         return _prefix;
  23.       }
  24.       set {
  25.         _prefix = !value.IsNullOrEmpty () ? value : "anon#";
  26.       }
  27.     }
  28.     // 获取用户名的私有方法
  29.     private string getName ()
  30.     {
  31.       var name = Context.QueryString["name"]; // 获取QueryString中的"name"字段的值作为用户名
  32.       return !name.IsNullOrEmpty () ? name : _prefix + getNumber (); // 如果"name"字段非空,则用户名为其值,否则,用户名为前缀+_number
  33.     }
  34.     // 获取_number的私有方法,并使用Interlocked增量操作该变量,保证线程安全
  35.     private static int getNumber ()
  36.     {
  37.       return Interlocked.Increment(ref _number);
  38.     }
  39.     // 覆盖基类的OnClose方法,该方法在WebSocket连接关闭时被调用
  40.     protected override void OnClose (CloseEventArgs e)
  41.     {
  42.       if (_name == null)
  43.         return;
  44.       var fmt = "{0} got logged off..."; // 定义消息格式
  45.       var msg = String.Format (fmt, _name); // 格式化消息字符串
  46.       Sessions.Broadcast (msg); // 向所有连接的会话广播消息
  47.     }
  48.     // 覆盖基类的OnMessage方法,该方法在收到WebSocket消息时被调用
  49.     protected override void OnMessage (MessageEventArgs e)
  50.     {
  51.       var fmt = "{0}: {1}"; // 定义消息格式
  52.       var msg = String.Format (fmt, _name, e.Data); // 格式化消息字符串
  53.       Sessions.Broadcast (msg); // 向所有连接的会话广播消息
  54.     }
  55.     // 覆盖基类的OnOpen方法,该方法在建立新的WebSocket连接后立即被调用
  56.     protected override void OnOpen ()
  57.     {
  58.       _name = getName (); // 获取用户名
  59.       var fmt = "{0} has logged in!"; // 定义消息格式
  60.       var msg = String.Format (fmt, _name); // 格式化消息字符串
  61.       Sessions.Broadcast (msg); // 向所有连接的会话广播消息
  62.     }
  63.   }
  64. }
复制代码
下面代码定义了名为Echo的类,该类继续自WebSocketBehavior,用于处理WebSocket服务器上的回声服务。当Echo服务的WebSocket连吸收到客户端送来的消息时,它简朴地将相同的消息数据直接返回给客户端。这个类通常用于测试客户端与服务器的连接是否正常,查抄消息的去程和回程耽误。
  1. using System; // 引入System命名空间
  2. using WebSocketSharp; // 引入WebSocketSharp命名空间,一个实现WebSocket协议的C#库
  3. using WebSocketSharp.Server; // 引入WebSocketSharp.Server命名空间,用于创建和管理WebSocket服务器
  4. // 定义Example3名字空间
  5. namespace Example3
  6. {
  7.   // 定义公共类Echo,继承自WebSocketBehavior
  8.   public class Echo : WebSocketBehavior
  9.   {
  10.     // 覆盖基类的OnMessage方法,该方法在收到WebSocket消息时被调用
  11.     protected override void OnMessage(MessageEventArgs e)
  12.     {
  13.       Send(e.Data); // 将收到的消息数据发送回客户端,实现回声(echo)功能
  14.     }
  15.   }
  16. }
复制代码
示例1

这段代码展示了如何使用WebSocketSharp库创建一个WebSocket客户端,连接到WebSocket服务器,并发送和吸收消息。它提供了处理打开连接、吸收消息、发生错误以及关闭连接的变乱处理步伐。代码还包括了调试相关的设置,以及一些被解释的代码块来展示如何配置WebSocket客户端(比方SSL证书验证、发送凭据、处理cookies等),但这些部门目前并未启用。用户通过控制台可以输入消息发送到服务器,输入"exit"来关闭步伐。
  1. using System; // 引入System命名空间,它是最基础的命名空间
  2. using System.Threading; // 引入多线程相关的命名空间
  3. using WebSocketSharp; // 引入WebSocketSharp库,它提供了WebSocket协议的实现
  4. using WebSocketSharp.Net; // 引入网络相关的命名空间
  5. namespace Example // 定义一个名为Example的命名空间
  6. {
  7.   public class Program // 定义一个公共类Program
  8.   {
  9.     public static void Main (string[] args) // 主函数,程序入口点
  10.     {
  11.         // 创建 WebSocket 类的新实例。
  12.        //
  13.        // WebSocket类继承了System.IDisposable接口,因此可以
  14.        // 使用using 语句。 WebSocket 连接将被关闭
  15.        // 当控件离开 using 块时关闭状态 1001(离开)。
  16.        //
  17.        // 如果您想通过安全连接连接到服务器,
  18.        // 您应该使用 wss 方案 WebSocket URL 创建一个新实例。
  19.       using (var ws = new WebSocket ("ws://localhost:4649/Echo")) // 创建一个WebSocket实例连接到指定的服务端地址和端口
  20.       //using (var ws = new WebSocket ("wss://localhost:5963/Echo"))
  21.       //using (var ws = new WebSocket ("ws://localhost:4649/Chat"))
  22.       //using (var ws = new WebSocket ("wss://localhost:5963/Chat"))
  23.       //using (var ws = new WebSocket ("ws://localhost:4649/Chat?name=nobita"))
  24.       //using (var ws = new WebSocket ("wss://localhost:5963/Chat?name=nobita"))
  25.       {
  26.         // 设置WebSocket事件
  27.         ws.OnOpen += (sender, e) => ws.Send ("Hi, there!"); // 当WebSocket连接建立时,发送一条消息"Hi, there!"
  28.         ws.OnMessage += (sender, e) => { // 当从服务端接收到消息时,执行该事件
  29.             var fmt = "[WebSocket Message] {0}"; // 定义一个格式字符串
  30.             var body = !e.IsPing ? e.Data : "A ping was received."; // 如果接收到的不是Ping消息,则输出数据,否则输出"A ping was received."
  31.             Console.WriteLine (fmt, body); // 将消息输出到控制台
  32.           };
  33.         ws.OnError += (sender, e) => { // 当发生错误时,执行该事件
  34.             var fmt = "[WebSocket Error] {0}"; // 定义一个格式字符串
  35.             Console.WriteLine (fmt, e.Message); // 将错误信息输出到控制台
  36.           };
  37.         ws.OnClose += (sender, e) => { // 当WebSocket连接关闭时,执行该事件
  38.             var fmt = "[WebSocket Close ({0})] {1}"; // 定义一个格式字符串
  39.             Console.WriteLine (fmt, e.Code, e.Reason); // 将关闭信息输出到控制台
  40.           };
  41.   
  42. #if DEBUG
  43.         // 调试时设置的额外选项
  44.         ws.Log.Level = LogLevel.Trace; // 设置日志级别
  45.         // 设置等待Ping或Close的响应时间为10秒(代码被注释)
  46.         // ws.WaitTime = TimeSpan.FromSeconds (10);
  47.         // 当接收到ping时触发WebSocket.OnMessage事件(代码被注释)
  48.         // ws.EmitOnPing = true;
  49. #endif
  50.         // 开启消息压缩功能
  51.         // ws.Compression = CompressionMethod.Deflate; //(代码被注释)
  52.         // 验证服务器证书(代码段被注释)
  53.         /*
  54.         ws.SslConfiguration.ServerCertificateValidationCallback =
  55.           (sender, certificate, chain, sslPolicyErrors) => {
  56.             // 省略了输出证书信息的代码
  57.             return true; // 如果服务器证书有效
  58.           };
  59.          */
  60.         // 发送HTTP认证信息(基础认证或摘要认证)(代码被注释)
  61.         // ws.SetCredentials ("nobita", "password", false);
  62.         // 发送来源页首部(代码被注释)
  63.         // ws.Origin = "http://localhost:4649";
  64.         // 发送cookies(代码被注释)
  65.         // ws.SetCookie (new Cookie ("name", "nobita"));
  66.         // ws.SetCookie (new Cookie ("roles", ""idiot, gunfighter""));
  67.         // 通过HTTP代理服务器连接(代码被注释)
  68.         // ws.SetProxy ("http://localhost:3128", "nobita", "password");
  69.         // 开启重定向(代码被注释)
  70.         // ws.EnableRedirection = true;
  71.         ws.Connect (); // 连接到服务器
  72.         // 异步连接到服务器(代码被注释)
  73.         // ws.ConnectAsync ();
  74.         Console.WriteLine ("
  75. Type 'exit' to exit.
  76. "); // 输出提示信息
  77.         while (true) { // 开始一个循环,持续监听输入
  78.           Thread.Sleep (1000); // 线程休眠1秒
  79.           Console.Write ("> "); // 控制台输出"> "
  80.           var msg = Console.ReadLine (); // 读取用户输入
  81.           if (msg == "exit") // 如果输入的是"exit"
  82.             break; // 跳出循环
  83.           ws.Send (msg); // 将输入的消息发送到WebSocket服务器
  84.         }
  85.       }
  86.     }
  87.   }
  88. }
复制代码
示例2

这段代码演示了如何使用WebSocketSharp库创建一个WebSocket服务器,并监听特定的端口(比方4649)。服务器被配置为提供两种WebSocket服务:Echo和Chat。服务器的日志级别在调试模式下被设置为Trace,以便记录具体信息,方便开发者调试。别的,代码还包罗了一些解释掉的部门,展示了如何进行更多高级配置,比方配置SSL/TLS安全连接,启用HTTP基础或择要认证,设置所在重用,定制WebSocket服务的初始化参数等。此中大多数配置目前都被解释了,以是不会生效。服务器启动后,会打印正在监听的端口和提供的WebSocket服务路径。代码的末了部门等候用户按回车键来停止服务器。
  1. using System; // 使用System命名空间,包含基本的类定义和类型。
  2. using System.Configuration; // 引用配置管理相关的类,如读取配置文件等。
  3. using System.Security.Cryptography.X509Certificates; // 引用安全性和加密相关的类,特别是处理X509证书。
  4. using WebSocketSharp; // 引用WebSocketSharp库,它提供实现WebSocket协议的类。
  5. using WebSocketSharp.Net; // 引用网络相关的类。
  6. using WebSocketSharp.Server; // 引用WebSocket服务器相关的类。
  7. namespace Example2 // 定义一个名为Example2的命名空间。
  8. {
  9.   public class Program // 定义一个公共类Program。
  10.   {
  11.     public static void Main (string[] args) // 主函数,程序的入口点。
  12.     {
  13.       // 创建一个新的WebSocketServer实例。
  14.       var wssv = new WebSocketServer (4649); // 初始化一个监听端口为4649的WebSocket服务器实例。
  15.       //var wssv = new WebSocketServer (5963, true); // (被注释)同时指出此服务器为安全连接(wss)。
  16.         //var wssv = new WebSocketServer (System.Net.IPAddress.Any, 4649); // 使用任意IPv4地址。
  17.         //var wssv = new WebSocketServer (System.Net.IPAddress.Any, 5963, true); // 使用任意IPv4地址和提供安全连接。
  18.         //var wssv = new WebSocketServer (System.Net.IPAddress.IPv6Any, 4649); // 使用任意IPv6地址。
  19.         //var wssv = new WebSocketServer (System.Net.IPAddress.IPv6Any, 5963, true); // 使用任意IPv6地址和提供安全连接。
  20.         //var wssv = new WebSocketServer ("ws://0.0.0.0:4649"); // 使用IPv4通配地址。
  21.         //var wssv = new WebSocketServer ("wss://0.0.0.0:5963"); // 使用IPv4通配地址和提供安全连接。
  22.         //var wssv = new WebSocketServer ("ws://[::0]:4649"); // 使用IPv6通配地址。
  23.         //var wssv = new WebSocketServer ("wss://[::0]:5963"); // 使用IPv6通配地址和提供安全连接。
  24.         //var wssv = new WebSocketServer (System.Net.IPAddress.Loopback, 4649); // 使用本机回环地址IPv4。
  25.         //var wssv = new WebSocketServer (System.Net.IPAddress.Loopback, 5963, true); // 使用本机回环地址IPv4和提供安全连接。
  26.         //var wssv = new WebSocketServer (System.Net.IPAddress.IPv6Loopback, 4649); // 使用本机回环地址IPv6。
  27.         //var wssv = new WebSocketServer (System.Net.IPAddress.IPv6Loopback, 5963, true); // 使用本机回环地址IPv6和提供安全连接。
  28.         //var wssv = new WebSocketServer ("ws://localhost:4649"); // 使用localhost和端口4649。
  29.         //var wssv = new WebSocketServer ("wss://localhost:5963"); // 使用localhost和端口5963提供安全连接。
  30.         //var wssv = new WebSocketServer ("ws://127.0.0.1:4649"); // 使用IPv4的本机回环地址和端口4649。
  31.         //var wssv = new WebSocketServer ("wss://127.0.0.1:5963"); // 使用IPv4的本机回环地址和端口5963提供安全连接。
  32.         //var wssv = new WebSocketServer ("ws://[::1]:4649"); // 使用IPv6的本机回环地址和端口4649。
  33.         //var wssv = new WebSocketServer ("wss://[::1]:5963"); // 使用IPv6的本机回环地址和端口5963提供安全连接。
  34. #if DEBUG
  35.       // 更改日志级别(只有在调试模式下起作用)。
  36.       wssv.Log.Level = LogLevel.Trace; // 设置日志级别为Trace(追踪),目的是显示尽可能多的调试信息。
  37.       // 更改WebSocket Ping或Close回应的等待时间(代码被注释)。
  38.       // wssv.WaitTime = TimeSpan.FromSeconds (2);
  39.       // 不定期移除非活动会话(代码被注释)。
  40.       // wssv.KeepClean = false;
  41. #endif
  42.       // 提供安全连接(代码段被注释)。
  43.       /*
  44.       var cert = ConfigurationManager.AppSettings["ServerCertFile"]; // 从配置文件获取证书文件路径。
  45.       var passwd = ConfigurationManager.AppSettings["CertFilePassword"]; // 从配置文件获取证书密码。
  46.       wssv.SslConfiguration.ServerCertificate = new X509Certificate2 (cert, passwd); // 创建证书实例并应用于服务器的SSL配置。
  47.        */
  48.       // 提供HTTP认证(基础/摘要)(代码段被注释)。
  49.       /*
  50.       wssv.AuthenticationSchemes = AuthenticationSchemes.Basic; // 设置认证方案为Basic(基础认证)。
  51.       wssv.Realm = "WebSocket Test"; // 设置认证域为"WebSocket Test"。
  52.       wssv.UserCredentialsFinder = id => { // 设置用户凭据查找函数。
  53.           var name = id.Name; // 获取用户名。
  54.           // 返回用户名、密码和角色。
  55.           return name == "nobita" // 如果用户名为"nobita",则返回凭据。
  56.                  ? new NetworkCredential (name, "password", "gunfighter")
  57.                  : null; // 如果用户凭据未找到,返回null。
  58.         };
  59.        */
  60.       // 解决等待处于TIME_WAIT状态的套接字(代码被注释)。
  61.       // wssv.ReuseAddress = true;
  62.       // 添加WebSocket服务。
  63.       wssv.AddWebSocketService<Echo> ("/Echo"); // 添加名为"/Echo"的WebSocket回音服务。
  64.       wssv.AddWebSocketService<Chat> ("/Chat"); // 添加名为"/Chat"的WebSocket聊天服务。
  65.       // 添加WebSocket服务并进行初始化(代码段被注释)。
  66.         // 用初始化方案添加WebSocket服务(以下代码被注释,并没有在实际程序中运行)。
  67.         /*
  68.         wssv.AddWebSocketService<Chat> (
  69.         "/Chat",
  70.         s => {
  71.             s.Prefix = "Anon#"; // 设置聊天服务的前缀。
  72.             // 发送包含子协议名称的Sec-WebSocket-Protocol头。
  73.             s.Protocol = "chat"; // 为聊天服务设置子协议。
  74.             // 忽略Sec-WebSocket-Extensions头。
  75.             s.IgnoreExtensions = true; // 忽略WebSocket扩展。
  76.             // 在接收到ping时发出WebSocket.OnMessage事件。
  77.             s.EmitOnPing = true; // 允许ping消息触发OnMessage事件。
  78.             // 验证Origin头。
  79.             s.OriginValidator = val => {
  80.                 // 检查Origin头的值,如果有效则返回true。
  81.                 Uri origin;
  82.                 return !val.IsNullOrEmpty()
  83.                     && Uri.TryCreate(val, UriKind.Absolute, out origin)
  84.                     && origin.Host == "localhost"; // 如果来源是localhost,则认为是有效的。
  85.             };
  86.             // 验证cookies。
  87.             s.CookiesValidator = (req, res) => {
  88.                 // 检查请求中的cookies,并在必要时设置要发送给客户端的cookies。
  89.                 foreach (var cookie in req) {
  90.                 cookie.Expired = true; // 将请求中的所有cookie设置为过期。
  91.                 res.Add(cookie); // 将过期的cookie添加到响应中。
  92.                 }
  93.                 return true; // 如果验证有效则返回true。
  94.             };
  95.         }
  96.         );
  97.         */
  98.       wssv.Start (); // 启动WebSocket服务器。
  99.       // 如果WebSocket服务器正在监听,则输出信息。
  100.       if (wssv.IsListening) {
  101.         Console.WriteLine ("Listening on port {0}, and providing WebSocket services:", wssv.Port); // 打印监听端口及服务信息。
  102.         // 循环通过WebSocket服务器提供的服务路径,并打印出来。
  103.         foreach (var path in wssv.WebSocketServices.Paths)
  104.           Console.WriteLine ("- {0}", path); // 打印服务路径。
  105.       }
  106.       Console.WriteLine ("
  107. Press Enter key to stop the server..."); // 提示按回车键停止服务器。
  108.       Console.ReadLine (); // 等待用户输入回车键。
  109.       wssv.Stop (); // 停止WebSocket服务器。
  110.     }
  111.   }
  112. }
复制代码
笔记




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表