WebSocket
介绍
1:我们可以通过WebSocket类使用WebSocket功能。我们只需要将服务器的Uri传递给WebSocket的构造函数
2:创建
var webSocket = new WebSocket(new Uri("wss://html5labs-interop.cloudapp.net/echo"));
3:,OnOpen事件:在建立与服务器的连接时调用。在此事件回调之后,WebSocket的IsOpen属性将为True,直到我们或服务器关闭连接或发生错误。
webSocket.OnOpen += OnWebSocketOpen;
private void OnWebSocketOpen(WebSocket webSocket) { Debug.Log("WebSocket Open!"); }
4:,OnMessage事件:从服务器收到文本消息时调用。
webSocket.OnMessage += OnMessageReceived;
private void OnMessageReceived(WebSocket webSocket, string message) { Debug.Log("Text Message received from server: " + message); }
5:,OnBinary事件:从服务器收到二进制blob消息时调用。
webSocket.OnBinary += OnBinaryMessageReceived;
private void OnBinaryMessageReceived(WebSocket webSocket, byte[] message) { Debug.Log("Binary Message received from server. Length: " + message.Length); }
6:,OnClosed事件:在客户端或服务器关闭连接时调用,或发生内部错误。当客户端通过Close函数关闭连接时,它可以提供代码和消息,指示关闭的原因。服务器通常会回复我们的代码和消息。
webSocket.OnClosed += OnWebSocketClosed;
private void OnWebSocketClosed(WebSocket webSocket, UInt16 code, string message) { Debug.Log("WebSocket Closed!");}
7:OnError事件:当我们无法连接到服务器时调用,发生内部错误或连接丢失。第二个参数是Exception对象,但它可以为null。在这种情况下,检查WebSocket的InternalRequest应该告诉更多有关该问题的信息。
webSocket.OnError += OnError;
private void OnError(WebSocket ws, Exception ex)
{
string errorMsg = string .Empty;
if (ws.InternalRequest.Response != null)
{
errorMsg = string.Format("Status Code from Server: {0} and Message: {1}", ws.InternalRequest.Response.StatusCode, ws.InternalRequest.Response.Message);
}
Debug.Log("An error occured: " + (ex != null ? ex.Message : "Unknown: " + errorMsg));
}
8:OnErrorDesc事件:一个更具信息性的事件,此事件在OnError事件之后调用,因为后者仅使用Exception参数调用。但它可以提供更详细的错误报告。
webSocket.OnErrorDesc += OnErrorDesc;
void OnErrorDesc(WebSocket ws, string error) { Debug.Log("Error: " + error); }
9:在我们将所有事件注册完备之后,我们可以开始连接:
webSocket.Open();
在此步骤之后,我们将收到一个OnOpen事件的回调,我们可以开始向服务器发送消息。
// 发送字符串:
webSocket.Send("Message to the Server");
// 创建二进制流,并填充:
byte[] buffer = new byte[length];
//发送二进制流
webSocket.Send(buffer);
完成通信后/不需要的时候,关闭链接,无法重用已关闭的WebSocket实例。
webSocket.Close();
10:Ping消息:通过在收到OnOpen事件之前将StartPingThread属性设置为True,可以启动新线程将Ping消息发送到服务器。这样,Ping消息将定期发送到服务器。可以在PingFrequency属性中设置两次ping之间的延迟(默认值为1000ms).(相当于设置心跳包)
11:Pong消息:从插件服务器收到的所有ping消息将自动生成Pong应答。
12:Streaming:较长的文本或二进制消息将变得支离破碎。默认情况下,这些片段由插件自动组装。如果我们向WebSocket的OnIncompleteFrame事件注册事件处理程序,则可以覆盖此机制。每次客户端收到不完整的片段时都会调用此事件。这些片段将被插件忽略,它不会尝试组装这些片段,也不会存储它们。此事件可用于实现流式传输体验。(自定义组装消息).
使用Socket.IO
1:Socket.IO实现使用插件已有的功能。当轮询传输与其所有功能(cookie,连接重用等)一起使用时,它将发送HTTPRequests以获取握手数据,发送和接收数据包。 WebSocket实现用于WebSocket传输
1):易于使用和熟悉的api
2):兼容最新的Socket.IO规范
3):从轮询传输到websocket传输的无缝升级
4):断开时自动重新连接
5):简单高效的二进制数据发送和多种接收方式
6):在高级模式下使用它的强大工具(切换默认编码器,禁用自动解码等)
2:使用.如果要连接到Socket.IO服务,可以使用BestHTTP.SocketIO.SocketManager类来完成。首先,您必须创建一个SocketManager实例
using System; using BestHTTP;
using BestHTTP.SocketIO;
var manager = new SocketManager(new Uri("http://chat.socket.io/socket.io/"));
3:Url中的/socket.io/路径非常重要,默认情况下,Socket.IO服务器将侦听此查询。所以不要忘记测试!
4:Connecting to namespaces ,默认情况下,SocketManager将在连接到服务器时连接到根(“/”)命名空间。您可以通过SocketManager的Socket属性访问它:
Socket root = manager.Socket;
可以通过GetSocket('/ nspName')函数或通过manager的indexer属性访问非默认名称空间:
Socket nsp = manager["/customNamespace"];
// 等价于:
Socket nsp = manager.GetSocket("/customNamespace");
首次访问命名空间将启动内部连接过程
4:Subscribing and receiving events ,您可以订阅预定义和自定义事件。预定义事件是“连接”,“连接”,“事件”,“断开连接”,“重新连接”,“重新连接”,“重新连接”,“重新连接失败”,“错误”。("connect", "connecting", "event", "disconnect", "reconnect", "reconnecting", "reconnect_attempt", "reconnect_failed", "error". )自定义事件是程序员定义的事件,服务器将发送给您的客户端。您可以通过调用套接字的On函数来订阅事件:
manager.Socket.On("login", OnLogin);
manager.Socket.On("new message", OnNewMessage);
void OnLogin(Socket socket, Packet packet, params object[] args)
{
//Socket参数将是服务器发送此事件的namespace-socket对象
//Packet参数包含事件的内部分组数据。数据包可用于访问服务器发送的二进制数据,或使用自定义Json解析器lib解码有效负载数据。稍后会详细介绍。
//Args参数是一个可变长度数组,包含来自数据包有效负载数据的解码对象。使用默认的Json编码器,这些参数可以是“原始”类型(int,double,string)或对象列表(List对象)或Dictionary字符串,对象对象。
}
//服务器上面的代码写法,在一个 node.js 的服务器上面
socket.emit('message', ‘MyNick’, ‘Msg to the client’);
//客户端接收
// subscribe to the "message" event
manager.Socket.On("message", OnMessage);
// event handler
void OnMessage(Socket socket, Packet packet, params object[] args)
{
// args[0] is the nick of the sender
// args[1] is the message
Debug.Log(string.Format("Message from {0}: {1}", args[0], args[1]));
}
●“connect”:命名空间打开时发送。
●“connecting”:当SocketManager开始连接到socket.io服务器时发送。
●“event”:在自定义(程序员定义的)事件上发送。
●“disconnect”:当传输断开,SocketManager关闭,Socket关闭或在握手数据中指定的给定时间内没有从服务器收到Pong消息时发送。
●“reconnect”:插件成功重新连接到socket.io服务器时发送。
●“reconnecting”:当插件尝试重新连接到socket.io服务器时发送。
●“reconnect_attempt”:当插件尝试重新连接到socket.io服务器时发送。
●“reconnect_failed”:重新连接尝试无法连接到服务器并且ReconnectAttempt达到选项“ReconnectionAttempts”值时发送。
●“error”:在服务器或内部插件错误上发送。事件的唯一参数是BestHTTP.Soc