示例#1
0
        // 关闭连接
        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);
        }
示例#2
0
 // 持续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));
 }
示例#3
0
        // 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);
        }