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; } } }); }
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); } }
private void CloseHandler() { if (State != SocketIOState.Closed) { State = SocketIOState.Closed; _client.Stop(WebSocketCloseStatus.NormalClosure, string.Empty); _pingSource.Cancel(); OnClosed?.Invoke(ServerCloseReason.ClosedByServer); } }
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); }
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)); }
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; } } } }
public Task InvokeConnectedAsync() { State = SocketIOState.Connected; OnConnected?.Invoke(); return(Task.CompletedTask); }
private void ConnectHandler() { State = SocketIOState.Connected; OnConnected?.Invoke(); }
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); }