// 关闭连接 public Task Close() { if (_Response.State == SocketState.Connect) { if (_TokenSource != null) { _TokenSource.Cancel(); _TokenSource.Dispose(); } _TokenSource = null; if (_Response.State != SocketState.Close) { _Response.State = SocketState.Close; _EventTarget.Emit(SocketStockEvent.Close); } if (_Socket != null) { _Socket.Abort(); _Socket.Dispose(); } _Socket = null; _Request = null; _Response = null; } return(Task.CompletedTask); }
// 持续Ping public Task PingLoop(int pingInterval) { return(Task.Run(() => { //呼吸包 while (true) { if (_Socket != null && _Socket.State == WebSocketState.Open) { Task.Delay(pingInterval).Wait(); Ping().Wait(); _EventTaget.Emit(SocketStockEvent.Ping); } else { break; } } }, _TokenSource.Token)); }
// socket 全局监听 public void Listen() { // 断开连接监听 Task.Run(() => { while (true) { Task.Delay(500).Wait(); if (State != SocketState.Close && State != SocketState.Abort) { // 异常检测 if (_Socket.State == WebSocketState.Aborted) { if (State != SocketState.Abort) { State = SocketState.Abort; _EventTarget.Emit(SocketStockEvent.Abort); } // 取消所有socket运行 _TokenSource.Cancel(); } else if (_Socket.State == WebSocketState.Closed) { if (State != SocketState.Close) { State = SocketState.Close; _EventTarget.Emit(SocketStockEvent.Close); } // 取消所有socket运行 _TokenSource.Cancel(); } } else { break; } } }, _TokenSource.Token); // 接收监听 Task.Run(() => { // 接收缓冲区 var buffer = new byte[_ReceiveChunkSize]; while (true) { // 打开状态 if (_Socket.State == WebSocketState.Open) { // 等待信息传输 WebSocketReceiveResult result = _Socket.ReceiveAsync(new ArraySegment <byte> (buffer), _TokenSource.Token).Result; // 判断数据类型 if (result.MessageType == WebSocketMessageType.Text) { var builder = new StringBuilder(); string str = Encoding.UTF8.GetString(buffer, 0, result.Count); builder.Append(str); // 全部接收 while (!result.EndOfMessage) { // 接收 result = _Socket.ReceiveAsync(new ArraySegment <byte> (buffer), _TokenSource.Token).Result; // 在为字符串 str = Encoding.UTF8.GetString(buffer, 0, result.Count); // 追加 builder.Append(str); } ParseReceive(builder.ToString()).Wait(); } else if (result.MessageType == WebSocketMessageType.Binary) { } } } }, _TokenSource.Token); }