示例#1
0
 public async Task InvokeOpenedAsync(OpenedArgs args)
 {
     await Task.Factory.StartNew(async() => {
         if (_namespace != null)
         {
             await SendMessageAsync("40" + _namespace);
         }
         State = SocketIOState.Connected;
         while (true)
         {
             if (State == SocketIOState.Connected)
             {
                 await Task.Delay(args.PingInterval);
                 SendMessageAsync(((int)EngineIOProtocol.Ping).ToString());
                 _isHeartbeatFinished = false;
                 _heartbeatDelay      = 0;
                 _isConnectTimeout    = false;
             }
             else
             {
                 break;
             }
         }
     });
 }
示例#2
0
 public async Task InvokeClosedAsync()
 {
     if (State != SocketIOState.Closed)
     {
         State = SocketIOState.Closed;
         await _socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, _tokenSource.Token);
         _tokenSource.Cancel();
         OnClosed?.Invoke(ServerCloseReason.ClosedByServer);
     }
 }
示例#3
0
 private void CloseHandler()
 {
     if (State != SocketIOState.Closed)
     {
         State = SocketIOState.Closed;
         _client.Stop(WebSocketCloseStatus.NormalClosure, string.Empty);
         _pingSource.Cancel();
         OnClosed?.Invoke(ServerCloseReason.ClosedByServer);
     }
 }
示例#4
0
        private void Listen()
        {
            // Listen State
            Task.Factory.StartNew(async() =>
            {
                while (true)
                {
                    await Task.Delay(500);
                    if (_socket.State == WebSocketState.Aborted || _socket.State == WebSocketState.Closed)
                    {
                        if (State != SocketIOState.Closed)
                        {
                            State = SocketIOState.Closed;
                            _tokenSource.Cancel();
                            OnClosed?.Invoke(ServerCloseReason.Aborted);
                        }
                    }
                }
            }, _tokenSource.Token);

            // Listen Message
            Task.Factory.StartNew(async() =>
            {
                var buffer = new byte[ReceiveChunkSize];
                while (true)
                {
                    if (_socket.State == WebSocketState.Open)
                    {
                        WebSocketReceiveResult result = await _socket.ReceiveAsync(new ArraySegment <byte>(buffer), _tokenSource.Token);
                        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 = await _socket.ReceiveAsync(new ArraySegment <byte>(buffer), _tokenSource.Token);
                                str    = Encoding.UTF8.GetString(buffer, 0, result.Count);
                                builder.Append(str);
                            }

                            var parser = new ResponseTextParser(_namespace, this)
                            {
                                Text = builder.ToString()
                            };
                            await parser.ParseAsync();
                        }
                    }
                }
            }, _tokenSource.Token);
        }
示例#5
0
        public Task connectAsync()
        {
            if (socket == null)
            {
                Debug.Log("Socket Url:" + info.url);
                socket       = new IO(info.url);
                _tokenSource = new CancellationTokenSource();

                /**
                 * 监控
                 **/
                socket.on(SocketStockEvent.Close, () => {
                    status = SocketIOState.CLOSED;
                    Debug.Log("Socket Closed");
                });
                socket.on(SocketStockEvent.Connect, () => {
                    status = SocketIOState.CONNECTED;
                    Debug.Log("Socket Connected");
                });

                status = SocketIOState.NONE;
            }

            return(Task.Run(() => {
                if (status != SocketIOState.CONNECTED && status != SocketIOState.CONNECTING)
                {
                    try {
                        status = SocketIOState.CONNECTING;
                        socket.connect().Wait();
                    } catch (System.Exception error) {
                        status = SocketIOState.ERROR;
                        throw error;
                    }
                }
                else if (status == SocketIOState.CONNECTING)
                {
                    while (true)
                    {
                        if (status != SocketIOState.CONNECTING)
                        {
                            break;
                        }
                        Task.Delay(60 / 1000).Wait();
                    }
                }
            }, _tokenSource.Token));
        }
示例#6
0
 public async Task CloseAsync()
 {
     if (socket != null)
     {
         if (status == SocketIOState.CONNECTED && status != SocketIOState.CLOSEING)
         {
             try {
                 _tokenSource.Cancel();
                 _tokenSource.Dispose();
                 status = SocketIOState.CLOSEING;
                 await socket.close();
             } catch (System.Exception error) {
                 status = SocketIOState.ERROR;
                 throw error;
             }
         }
     }
 }
示例#7
0
 public Task InvokeConnectedAsync()
 {
     State = SocketIOState.Connected;
     OnConnected?.Invoke();
     return(Task.CompletedTask);
 }
示例#8
0
 private void ConnectHandler()
 {
     State = SocketIOState.Connected;
     OnConnected?.Invoke();
 }
示例#9
0
        private void Listen()
        {
            // Listen State
            Task.Factory.StartNew(async() => {
                while (true)
                {
                    await Task.Delay(500);
                    if (!_isHeartbeatFinished)
                    {
                        _heartbeatDelay += 500;
                    }
                    if (!_isConnectTimeout && _heartbeatDelay >= _heartbeatTimeoutDelay)
                    {
                        _isConnectTimeout = true;
                        if (_timeoutNumber == 0)
                        {
                            InvokeConnectTimeout();
                        }
                        _timeoutNumber++;
                        if (_timeoutNumber == 2)
                        {
                            await CloseAsync();
                        }
                    }
                    if (_socket.State == WebSocketState.Aborted || _socket.State == WebSocketState.Closed)
                    {
                        if (State != SocketIOState.Closed)
                        {
                            State = SocketIOState.Closed;
                            _tokenSource.Cancel();
                            OnClosed?.Invoke(ServerCloseReason.Aborted);
                        }
                    }
                }
            }, _tokenSource.Token);

            // Listen Message
            Task.Factory.StartNew(async() => {
                while (true)
                {
                    var buffer = new byte[ReceiveChunkSize];
                    Console.WriteLine("_socket.State " + _socket.State.ToString());
                    if (_socket.State == WebSocketState.Open)
                    {
                        WebSocketReceiveResult result = await _socket.ReceiveAsync(new ArraySegment <byte> (buffer), _tokenSource.Token);
                        if (result.MessageType == WebSocketMessageType.Text)
                        {
                            var bufferList = new List <byte> ();
                            byte[] bufferTotal;
                            int totalCount = 0;
                            bufferList.AddRange(buffer);
                            totalCount += result.Count;

                            while (!result.EndOfMessage)
                            {
                                result      = await _socket.ReceiveAsync(new ArraySegment <byte> (buffer), _tokenSource.Token);
                                totalCount += result.Count;
                                bufferList.AddRange(buffer);
                            }
                            bufferTotal = bufferList.ToArray();
                            Console.WriteLine($"GetWebSocket Data in len: {bufferList.Count()}, data: {Encoding.UTF8.GetString(bufferTotal, 0, totalCount)}");
                            var parser = new ResponseTextParser(_namespace, this)
                            {
                                Text = Encoding.UTF8.GetString(bufferTotal, 0, totalCount)
                            };
                            //Console.WriteLine("parser.ParseAsync" + parser.Text);
                            await parser.ParseAsync();
                        }
                        else if (result.MessageType == WebSocketMessageType.Binary)
                        {
                            string str = "binary";
                            try {
                                str = Encoding.UTF8.GetString(buffer, 0, result.Count);
                            } catch (Exception e) {
                                Console.WriteLine(e.ToString());
                            }
                            Console.WriteLine("GetWebSocket Data : " + str);
                        }
                    }
                    else
                    {
                        Thread.Sleep(1000);
                    }
                }
            }, _tokenSource.Token);
        }