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<...>
代理(因此我已将其添加到该资产包中)。 - 如果是Core项目,则引用下面的包
1 | <ItemGroup> |
websocket-sharp组件使用方法
WebSocket客户端
1 | using System; |
- 由上面的代码示例中,使用
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
方法。
WebSocket服务器
1 | using System; |
- 以通过创建继承
WebSocketBehavior
该类的类定义任何WebSocket服务的行为。可以WebSocketServer
通过使用WebSocketServer.AddWebSocketService<TBehaviorWithNew> (string)
或WebSocketServer.AddWebSocketService<TBehavior> (string, Func<TBehavior>)
方法将任何WebSocket服务添加到服务的指定行为和路径。wssv.Start ();启动WebSocket服务器。wssv.Stop (code, reason);停止WebSocket服务器。
消息压缩
1 | ws.Compression = CompressionMethod.Deflate; |
HTTP身份验证
1 | ws.SetCredentials ("nobita", "password", preAuth); |
通过HTTP代理服务器连接
1 | var ws = new WebSocket ("ws://example.com"); |
websocket-sharp组件核心对象解析
WebSocket.Send()
1 | private bool send (Opcode opcode, Stream stream) |
- 使用WebSocket连接发送指定的数据,该方法存在多个重载版本,并且该方法也有异步实现。该方法返回一个布尔类型的参数,表示本次信息是否发送成功。该方法接受两个参数,Opcode是一个枚举类型,表示WebSocket框架类型。该枚举类型值有Cont(等于数值0.表示连续帧),Text(相当于数值1.表示文本框),Binary(相当于数值2.表示二进制帧),Close(相当于数值8.表示连接关闭框架),Ping(相当于数值9.表示ping帧),Pong(相当于数值10.指示pong框)。stream表示一个流对象。该方法设置了锁操作,防止并发时出现死锁问题。不过看到代码中对异常的捕获还是有些问题,该方法是直接捕获exception异常,这样会导致程序捕获代码块中的所有异常,这样会影响代码的稳定性和代码的可修复性,异常捕获的最好处理方式是将程序进行恢复。
WebSocket.CloseAsync()
1 | public void CloseAsync (CloseStatusCode code, string reason) |
- 该方法以指定的方式异步关闭WebSocket连接,该方法接受两个参数,CloseStatusCode表示关闭原因的状态码,该参数是一个枚举类型。reason表示关闭的原因。大小必须是123字节或更少。if (!CheckParametersForClose (code, reason, _client, out msg))检查参数关闭。
WebSocket.createHandshakeRequest()
1 | private HttpRequest createHandshakeRequest() |
- 该方法用于客户端创建一个websocket请求,创建握手请求。var ret = HttpRequest.CreateWebSocketRequest(_uri);根据传入的uri调用HttpRequest的方法创建请求。该方法主要操作http头部信息,创建请求。
- 转载自:彭泽博客