LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# WebSocket-Sharp 完整指南

admin
2024年12月2日 9:48 本文热度 483

1. 简介

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

  • 完全支持 RFC 6455 协议规范

  • 支持客户端和服务器端实现

  • 支持消息压缩扩展

  • 支持安全连接(SSL/TLS)

  • 支持 HTTP 认证

  • 支持查询字符串、Origin 头和 Cookies

  • 支持 HTTP 代理服务器连接

  • 支持 .NET Framework 3.5 及更高版本

2. 安装方式

2.1 手动构建

  1. 使用 MonoDevelop 打开 websocket-sharp.sln

  2. 构建 websocket-sharp 项目

  3. 将生成的 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
{
   // 聊天室处理类  
   publicclass ChatRoom : WebSocketBehavior
   {
       privatestatic Dictionary<stringstring> _users = new Dictionary<stringstring>();
       privatestring _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)
       
{
           conststring chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
           Random random = new Random();
           returnnewstring(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(4649true); // 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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved