【转】开源的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);}}}
}

复制代码

复制代码

     由上面的代码示例中,使用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,这里也只是简单的介绍,需要使用的同学,可以自取,因为该组件是开源的,所以一些实际情况中可以自行修改源码,达到最大限度的扩展性。在项目的技术选择中,个人比较主张开源免费的框架和组件,不仅是项目预算的问题,更有方便扩展的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【编译原理】什么是上下文无关文法?

上下文无关是指&#xff0c;一句话的含义与其前后的内容没有或者几乎没有关系&#xff0c;只由自己决定&#xff0c;把它剪切到其他任何位置&#xff0c;也还是原有的意思。 例如&#xff1a; ... a 0; ...这是一个赋值语句&#xff0c;无论此语句的前后是什么代码&#xff…

python解析html的库_用python解析html

python中&#xff0c;有三个库可以解析html文本&#xff0c;HTMLParser,sgmllib,htmllib。他们的实现方法不通&#xff0c;但功能差不多。这三个库中 提供解析html的类都是基类&#xff0c;本身并不做具体的工作。他们在发现的元件后(如标签、注释、声名等)&#xff0c;会调用相…

【转】3.1(译)构建Async同步基元,Part 1 AsyncManualResetEvent

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

java异或_JAVA面试必备之HashMap必会点

今天我们就面试会问到关于HashMap的问题进行一个汇总&#xff0c;以及对这些问题进行解答。1、HashMap的数据结构是什么&#xff1f;2、为啥是线程不安全的&#xff1f;3、Hash算法是怎样实现的&#xff1f;4、HashMap是如何处理Hash碰撞的&#xff1f;5、增加元素的方法是怎么…

【编译原理】什么是AST?

自己写的确实没有别人写的好&#xff0c;所以在此推荐以下内容供参考&#xff1a; 抽象语法树—百度百科 AST系列(一): 抽象语法树为什么抽象 编程语言的实现&#xff0c;从AST&#xff08;抽象语法树&#xff09;开始 知乎话题-抽象语法树

【转】3.2(译)构建Async同步基元,Part 2 AsyncAutoResetEvent

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

关注我——个人公众号&#xff1a;后端技术漫谈我目前是一名后端开发工程师。主要关注后端开发&#xff0c;数据安全&#xff0c;网络爬虫&#xff0c;物联网&#xff0c;边缘计算等方向。原创博客主要内容Java知识点复习全手册Leetcode算法题解析剑指offer算法题解析SpringClo…

【编译原理】学习LUA

前言 先了解一下什么是LUA&#xff1a; LUA官网&#xff1a;LUA官网 LUA介绍&#xff1a;LUA-百度百科 LUA教程&#xff1a;LUA教程-菜鸟教程 深入LUA 想要深入LUA&#xff0c;只有一个办法&#xff0c;就是看源码&#xff0c;下面是地址&#xff1a; https://github.com/l…

【转】3.3(译)构建Async同步基元,Part 3 AsyncCountdownEvent

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用

友情提示&#xff1a;全文约2600字&#xff0c;预计阅读时间12分钟摘要消息队列作为重要的中间件&#xff0c;广泛用于分布式系统中各子系统间的异步解耦&#xff1b;本文主要介绍了大云消息队列中间件BC-MQ在BC-DeepWatch中的应用案例。一、消息队列应用场景简介消息队列是分布…

【编译原理】如何编写BNF?

此篇文章承接上一篇&#xff1a;【编译原理】理解BNF 前言 理解了BNF&#xff0c;就能实现代码解析了吗&#xff1f;还有点早&#xff0c;因为理解了BNF&#xff0c;还要会写BNF。实际上&#xff0c;BNF实现有固定的模式&#xff0c;也有现成的工具&#xff0c;比如可以使用ya…

【转】3.4(译)构建Async同步基元,Part 4 AsyncBarrier

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

python语言中百分号是什么意思_Python中%是什么意思?python中百分号如何使用?...

常见的两种第一种&#xff1a;数值运算 1 % 3 是指模运算, 取余数(remainder)>>> 7%21# -*- coding: utf-8 -*-python读取文件&#xff0c;偶数行输出一个文件&#xff0c;奇数行输出一个文件def fenhang(infile,outfile,outfile1):infopen open(infile,r,encodingut…

【编译原理】如何根据EBNF编写代码?

此篇文章承接上一篇&#xff1a;【编译原理】如何编写BNF&#xff1f; 我们知道&#xff0c;完整的编译过程总体大概需要经历六个阶段&#xff1a; 词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成 EBNF是位于词法分析阶段涉及的技术。 要…

【转】3.5(译)构建Async同步基元,Part 5 AsyncSemaphore

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

python利用写模块_使用C++编写python扩展模块

简介长话短说&#xff0c;这里说的扩展Python功能与直接用其它语言写一个动态链接库&#xff0c;然后让Python来调用有点不一样(虽然本质是一样的)。而是指使用Python本身提供的API&#xff0c;使用C来对Python进行功能性扩展&#xff0c;可以这样理解&#xff0c;使用更高效的…

【编译原理】词法分析程序设计

概述 词法分析即对程序源码进行分词处理&#xff0c;分词处理就是把文本流分割成一个又一个符号。分词处理的输入输出是什么呢&#xff1f; 输入是源码字符串流输出是&#xff1a; 整型的类型枚举值&#xff0c;表示符号类型&#xff0c;如字符串&#xff1b;符号内容信息&…

【转】3.6(译)构建Async同步基元,Part 6 AsyncLock

传送门&#xff1a;异步编程系列目录…… 最近在学习.NET4.5关于“并行任务”的使用。“并行任务”有自己的同步机制&#xff0c;没有显示给出类似如旧版本的&#xff1a;事件等待句柄、信号量、lock、ReaderWriterLock……等同步基元对象&#xff0c;但我们可以沿溪这一编程习…

python 当前时间减一个月_python排序了解一下

排序是每个开发人员都需要掌握的技能。排序是对程序本身有一个全面的理解。不同的排序算法很好地展示了算法设计上如何强烈的影响程序的复杂度、运行速度和效率。今天的文章和谈谈大家都熟悉的各种排序使用 Python 如何实现&#xff0c;废话就不多说啦&#xff0c;开干&#xf…

开发与重构

软件开发过程主要追求的是高效、易于维护。 高效开发体现了代码的复用率即开发效率&#xff0c;是为了缩短开发周期。 易于维护体现了代码的重构效率&#xff0c;是为了缩短维护周期。 编程语言&#xff0c;从C到C&#xff0c;实现了从函数复用&#xff0c;到类复用。其实编程…