下面我们介绍一款WebSocket组件websocket-sharp的相关内容。

一.websocket-sharp组件概述

websocket-sharp是一个C#实现websocket协议客户端和服务端,websocket-sharp支持RFC 6455;WebSocket客户端和服务器;消息压缩扩展;安全连接;HTTP身份验证;查询字符串,起始标题和Cookie;通过HTTP代理服务器连接;.NET Framework 3.5或更高版本(包括兼容环境,如Mono)。

websocket-sharp是一个单一的组件,websocket-sharp.dll。websocket-sharp是用MonoDevelop开发的。所以建立一个简单的方式是打开websocket-sharp.sln并使用MonoDevelop中的任何构建配置(例如Debug)运行websocket-sharp项目的构建。

上面介绍了.NET项目中添加websocket-sharp组件,如果想向Unity项目中使用该DLL ,则应将其添加到Unity Editor中的项目的任何文件夹。在Unity的项目中,Unity Free有一些约束:Webplayer的安全沙箱(Web Player中不提供该服务器);WebGL网络( WebGL中不可用);不适用于此类UWP;对System.IO.Compression的有限支持(压缩扩展在Windows上不可用);iOS / Android的.NET Socket支持(如果您的Unity早于Unity 5,则需要iOS / Android Pro);适用于iOS / Android的.NET API 2.0兼容级别。适用于iOS / Android的.NET API 2.0兼容性级别可能需要在.NET 2.0之后修复缺少某些功能,例如System.Func<...>代理(因此我已将其添加到该资产包中)。

二.websocket-sharp组件使用方法

1.WebSocket客户端

using System;
using WebSocketSharp;namespace Example
{public class Program{public static void Main (string[] args){using (var ws = new WebSocket ("ws://dragonsnest.far/Laputa")) {ws.OnMessage += (sender, e) =>Console.WriteLine ("Laputa says: " + e.Data);ws.Connect ();ws.Send ("BALUS");Console.ReadKey (true);}}}
}

由上面的代码示例中,使用WebSocketWebSocket URL 创建类的新实例来连接。一个WebSocket.OnOpen当WebSocket连接已经建立发生的事件。WebSocket.OnMessage当发生事件WebSocket接收消息。一个WebSocket.OnClose当WebSocket的连接已关闭发生的事件。如果要异步连接到服务器,应该使用该WebSocket.ConnectAsync ()方法。可以使用WebSocket.Send (string)WebSocket.Send (byte[])WebSocket.Send (System.IO.FileInfo)方法来发送数据。如果您想要异步发送数据,则应该使用该WebSocket.SendAsync方法。如果要明确地关闭连接,应该使用该WebSocket.Close方法。

    2.WebSocket服务器

using System;
using WebSocketSharp;
using WebSocketSharp.Server;namespace Example
{public class Laputa : WebSocketBehavior{protected override void OnMessage (MessageEventArgs e){var msg = e.Data == "BALUS"? "I've been balused already...": "I'm not available now.";Send (msg);}}public class Program{public static void Main (string[] args){var wssv = new WebSocketServer ("ws://dragonsnest.far");wssv.AddWebSocketService<Laputa> ("/Laputa");wssv.Start ();Console.ReadKey (true);wssv.Stop ();}}
}

以通过创建继承WebSocketBehavior该类的类定义任何WebSocket服务的行为。可以WebSocketServer通过使用WebSocketServer.AddWebSocketService<TBehaviorWithNew> (string)WebSocketServer.AddWebSocketService<TBehavior> (string, Func<TBehavior>)方法将任何WebSocket服务添加到服务的指定行为和路径。wssv.Start ();启动WebSocket服务器。wssv.Stop (code, reason);停止WebSocket服务器。

    3.消息压缩

ws.Compression = CompressionMethod.Deflate;

   4.HTTP身份验证

ws.SetCredentials ("nobita", "password", preAuth);

 5.通过HTTP代理服务器连接

var ws = new WebSocket ("ws://example.com");
ws.SetProxy ("http://localhost:3128", "nobita", "password");

三.websocket-sharp组件核心对象解析

 1.WebSocket.Send():

    private bool send (Opcode opcode, Stream stream){lock (_forSend) {var src = stream;var compressed = false;var sent = false;try {if (_compression != CompressionMethod.None) {stream = stream.Compress (_compression);compressed = true;}sent = send (opcode, stream, compressed);if (!sent)error ("A send has been interrupted.", null);}catch (Exception ex) {_logger.Error (ex.ToString ());error ("An error has occurred during a send.", ex);}finally {if (compressed)stream.Dispose ();src.Dispose ();}return sent;}}

使用WebSocket连接发送指定的数据,该方法存在多个重载版本,并且该方法也有异步实现。该方法返回一个布尔类型的参数,表示本次信息是否发送成功。该方法接受两个参数,Opcode是一个枚举类型,表示WebSocket框架类型。该枚举类型值有Cont(等于数值0.表示连续帧),Text(相当于数值1.表示文本框),Binary(相当于数值2.表示二进制帧),Close(相当于数值8.表示连接关闭框架),Ping(相当于数值9.表示ping帧),Pong(相当于数值10.指示pong框)。stream表示一个流对象。该方法设置了锁操作,防止并发时出现死锁问题。不过看到代码中对异常的捕获还是有些问题,该方法是直接捕获exception异常,这样会导致程序捕获代码块中的所有异常,这样会影响代码的稳定性和代码的可修复性,异常捕获的最好处理方式是将程序进行恢复。

2.WebSocket.CloseAsync():

public void CloseAsync (CloseStatusCode code, string reason){string msg;if (!CheckParametersForClose (code, reason, _client, out msg)) {_logger.Error (msg);error ("An error has occurred in closing the connection.", null);return;}closeAsync ((ushort) code, reason);}

该方法以指定的方式异步关闭WebSocket连接,该方法接受两个参数,CloseStatusCode表示关闭原因的状态码,该参数是一个枚举类型。reason表示关闭的原因。大小必须是123字节或更少。if (!CheckParametersForClose (code, reason, _client, out msg))检查参数关闭。

3.WebSocket.createHandshakeRequest():

 private HttpRequest createHandshakeRequest(){var ret = HttpRequest.CreateWebSocketRequest(_uri);var headers = ret.Headers;if (!_origin.IsNullOrEmpty())headers["Origin"] = _origin;headers["Sec-WebSocket-Key"] = _base64Key;_protocolsRequested = _protocols != null;if (_protocolsRequested)headers["Sec-WebSocket-Protocol"] = _protocols.ToString(", ");_extensionsRequested = _compression != CompressionMethod.None;if (_extensionsRequested)headers["Sec-WebSocket-Extensions"] = createExtensions();headers["Sec-WebSocket-Version"] = _version;AuthenticationResponse authRes = null;if (_authChallenge != null && _credentials != null){authRes = new AuthenticationResponse(_authChallenge, _credentials, _nonceCount);_nonceCount = authRes.NonceCount;}else if (_preAuth){authRes = new AuthenticationResponse(_credentials);}if (authRes != null)headers["Authorization"] = authRes.ToString();if (_cookies.Count > 0)ret.SetCookies(_cookies);return ret;}

该方法用于客户端创建一个websocket请求,创建握手请求。var ret = HttpRequest.CreateWebSocketRequest(_uri);根据传入的uri调用HttpRequest的方法创建请求。该方法主要操作http头部信息,创建请求。

四.总结

对于这个组件,个人感觉还是有一些用,这个组件很好的实现了websocket,这里也只是简单的介绍,需要使用的同学,可以自取,因为该组件是开源的,所以一些实际情况中可以自行修改源码,达到最大限度的扩展性。在项目的技术选择中,个人比较主张开源免费的框架和组件,不仅是项目预算的问题,更有方便扩展的作用。

【转】开源的C# websocket-sharp组件解析相关推荐

  1. 微服务开源框架TARS 之 基础组件

    作者 herman 导语 本文源自herman的系列文章之一<鹅厂开源框架TARS之基础组件>.相关代码已按TARS开源社区最新版本更新. TARS开源框架库里面用C++实现了比较多的公用 ...

  2. 视觉SLAM开源算法ORB-SLAM3 原理与代码解析

    来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...

  3. [开源]C#二维码生成解析工具,可添加自定义Logo

    原文:[开源]C#二维码生成解析工具,可添加自定义Logo 二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Co ...

  4. 【SSM框架系列】Spring-MVC的组件解析

    SpringMVC完整执行流程 用户发送请求至前端控制器DispatcherServlet. DispatcherServlet收到请求调用HandlerMapping处理器映射器. 处理器映射器找到 ...

  5. 开源的关系型数据持久化组件

    Apache Empire-db 是一个开源的关系型数据持久化组件,能够实现数据库无关的动态查询定义,简便的数据读取和更新.与其它持久化组件相比 如:Hibernate.TopLink.iBATIS或 ...

  6. Twproject Gantt – 开源的 JavaScript 甘特图组件

    Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CSS 皮肤等功能.更重要的是, 它是免费开源的. ...

  7. epplus word html,.Net开源Excel、Word操作组件-NPOI、EPPlus、DocX

    一.NPOI 简介: NPOI is the .NET version of POI Java project. With NPOI, you can read/write Office 2003/2 ...

  8. 轻触开源(三)-Gson项目源码解析_贰

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:102525062 ...

  9. vue+websocket+Stomp组件实现前端长连接

    1文件结构 2.重点文件夹中的文件代码以及作用 ① 根目录中systemConfig文件夹中的main.js文件 /***作用:作为项目中的配置文件,放了websocket连接的url,用户名(adm ...

最新文章

  1. C#中Delegate和Event以及它们的区别(转载)
  2. linux机器启动pg数据库命令,Linux下创建Postgresql数据库的方法步骤
  3. pyecharts基础系列总结(含全系列文章路径)
  4. db2分页sql_停止尝试使用内部DB框架模拟SQL OFFSET分页!
  5. windows便签快捷键_win10电脑有哪些常用的快捷键?
  6. Vue2.0史上最全入坑教程(上)—— 搭建Vue脚手架(vue-cli)
  7. 使用StarUML生成live555类图
  8. js 判断字符串为空的方法
  9. 避坑指南!数据分析最容易被忽略的10个错误
  10. 用Java来写常见的排序算法
  11. linux 下tomcat catalina.out日志操作
  12. 做好ToB运营:避开4个误区和掌握3个获客方式
  13. Python模拟登陆古诗文网手动输入验证码显示验证码错误
  14. 1334172-76-7,Biotin-PEG7-amine生物素-PEG试剂,在EDC或HATU活化剂存在下与NHS酯或羧基酸反应
  15. 合理的电梯(水题 杭电排位赛-6)
  16. Package | 解决 Could not build wheels for opencv-python which use PEP 517 and cannot be installed
  17. 计算机网络知识点整理(笔试面试)
  18. 黑马程序员--typedef关键字和结构体 枚举类型
  19. 智能骨科图像方向,按照期刊进行的文献整理
  20. 开启CDN 后网站出现 “ 您的连接不是私密连接 ”

热门文章

  1. windows下eclipse调试hadoop详解
  2. Java中TreeMap和TreeSet的底层实现
  3. SVG_text.动态创建换行显示(横)
  4. 我的第一次Pascal程序
  5. BZOJ4122 : [Baltic2015]File paths
  6. 转载:Java编程风格与命名规范整理
  7. druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)
  8. Hibernate C3P0连接池配置
  9. linux如何创建备份文件,如何备份Linux 配置文件
  10. python如何处理数据_python数据处理之如何选取csv文件中某几行的数据