长春新建火车站,网站建设 服务器主机配置,wordpress 4.8.2 主题,云主机购买下面我们介绍一款WebSocket组件websocket-sharp的相关内容。
一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端#xff0c;websocket-sharp支持RFC 6455#xff1b;WebSocket客户端和服务器#xff1b;消息压缩扩展#xff1b;安全连接…下面我们介绍一款WebSocket组件websocket-sharp的相关内容。
一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端websocket-sharp支持RFC 6455WebSocket客户端和服务器消息压缩扩展安全连接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? Ive been balused already...: Im not available now.;Send (msg);}}public class Program{public static void Main (string[] args){var wssv new WebSocketServer (ws://dragonsnest.far);wssv.AddWebSocketServiceLaputa (/Laputa);wssv.Start ();Console.ReadKey (true);wssv.Stop ();}}
} 以通过创建继承WebSocketBehavior该类的类定义任何WebSocket服务的行为。可以WebSocketServer通过使用WebSocketServer.AddWebSocketServiceTBehaviorWithNew (string)或WebSocketServer.AddWebSocketServiceTBehavior (string, FuncTBehavior)方法将任何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这里也只是简单的介绍需要使用的同学可以自取因为该组件是开源的所以一些实际情况中可以自行修改源码达到最大限度的扩展性。在项目的技术选择中个人比较主张开源免费的框架和组件不仅是项目预算的问题更有方便扩展的作用。