【转】开源的C# websocket-sharp组件解析
下面我们介绍一款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);}}} }
由上面的代码示例中,使用WebSocket
WebSocket 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组件解析相关推荐
- 微服务开源框架TARS 之 基础组件
作者 herman 导语 本文源自herman的系列文章之一<鹅厂开源框架TARS之基础组件>.相关代码已按TARS开源社区最新版本更新. TARS开源框架库里面用C++实现了比较多的公用 ...
- 视觉SLAM开源算法ORB-SLAM3 原理与代码解析
来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...
- [开源]C#二维码生成解析工具,可添加自定义Logo
原文:[开源]C#二维码生成解析工具,可添加自定义Logo 二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Co ...
- 【SSM框架系列】Spring-MVC的组件解析
SpringMVC完整执行流程 用户发送请求至前端控制器DispatcherServlet. DispatcherServlet收到请求调用HandlerMapping处理器映射器. 处理器映射器找到 ...
- 开源的关系型数据持久化组件
Apache Empire-db 是一个开源的关系型数据持久化组件,能够实现数据库无关的动态查询定义,简便的数据读取和更新.与其它持久化组件相比 如:Hibernate.TopLink.iBATIS或 ...
- Twproject Gantt – 开源的 JavaScript 甘特图组件
Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CSS 皮肤等功能.更重要的是, 它是免费开源的. ...
- 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 ...
- 轻触开源(三)-Gson项目源码解析_贰
2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:102525062 ...
- vue+websocket+Stomp组件实现前端长连接
1文件结构 2.重点文件夹中的文件代码以及作用 ① 根目录中systemConfig文件夹中的main.js文件 /***作用:作为项目中的配置文件,放了websocket连接的url,用户名(adm ...
最新文章
- C#中Delegate和Event以及它们的区别(转载)
- linux机器启动pg数据库命令,Linux下创建Postgresql数据库的方法步骤
- pyecharts基础系列总结(含全系列文章路径)
- db2分页sql_停止尝试使用内部DB框架模拟SQL OFFSET分页!
- windows便签快捷键_win10电脑有哪些常用的快捷键?
- Vue2.0史上最全入坑教程(上)—— 搭建Vue脚手架(vue-cli)
- 使用StarUML生成live555类图
- js 判断字符串为空的方法
- 避坑指南!数据分析最容易被忽略的10个错误
- 用Java来写常见的排序算法
- linux 下tomcat catalina.out日志操作
- 做好ToB运营:避开4个误区和掌握3个获客方式
- Python模拟登陆古诗文网手动输入验证码显示验证码错误
- 1334172-76-7,Biotin-PEG7-amine生物素-PEG试剂,在EDC或HATU活化剂存在下与NHS酯或羧基酸反应
- 合理的电梯(水题 杭电排位赛-6)
- Package | 解决 Could not build wheels for opencv-python which use PEP 517 and cannot be installed
- 计算机网络知识点整理(笔试面试)
- 黑马程序员--typedef关键字和结构体 枚举类型
- 智能骨科图像方向,按照期刊进行的文献整理
- 开启CDN 后网站出现 “ 您的连接不是私密连接 ”
热门文章
- windows下eclipse调试hadoop详解
- Java中TreeMap和TreeSet的底层实现
- SVG_text.动态创建换行显示(横)
- 我的第一次Pascal程序
- BZOJ4122 : [Baltic2015]File paths
- 转载:Java编程风格与命名规范整理
- druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)
- Hibernate C3P0连接池配置
- linux如何创建备份文件,如何备份Linux 配置文件
- python如何处理数据_python数据处理之如何选取csv文件中某几行的数据