/// <summary> /// Start to listen to client stream in separate thread /// </summary> /// <param name="client">The <see cref="TcpClient"/></param> private void RunClientStreaming(TcpClient client) { this.Log(this.ToString(), "client connected", LogLevel.Info); Task.Factory.StartNew(async() => { SocketStream socketStream = null; Models.Socket webSocket = null; try { NetworkStream stream = client.GetStream(); socketStream = new SocketStream(client, stream, string.Empty); socketStream.OnException += (ex) => this.Log("Stream error", ex); webSocket = new Models.Socket(socketStream); socketStream.Connected = true; this.Log(this.ToString(), "start listening", LogLevel.Debug); await this.StartListening(webSocket); } catch (Exception ex) { this.Log("stream error", ex); } // Clean up this.CloseStream(socketStream); }); }
/// <summary> /// Starts the listening. /// </summary> /// <param name="socket">The socket.</param> /// <returns> /// The <see cref="Task" /></returns> private async Task StartListening(Models.Socket socket) { List <byte> byteList = new List <byte>(); while (socket.SocketStream.Connected) { try { WebPackage package = await socket.GetPackage(); if (string.IsNullOrEmpty(socket.SocketStream.ClientId)) { socket.SocketStream.ClientId = package.ClientId; } if (package != null) { if (package.PackageType == PackageType.Fetch) { try { this.Log(this.ToString(), "fetching data...", LogLevel.Debug); WebPackage resultMessage = await this.OnFetch.Invoke(package); resultMessage.Id = package.Id; this.Log(this.ToString(), "Send fetch response", LogLevel.Debug); socket.SendPackage(resultMessage); } catch (Exception ex) { this.Log("Socket fetch error", ex); } } else if (package.PackageType == PackageType.Authentication) { new Task(async() => { this.Log(this.ToString(), "authenticating...", LogLevel.Debug); WebPackage resultMessage = await this.OnAuthenticate.Invoke(package); resultMessage.Id = package.Id; this.Log(this.ToString(), "Send auth response", LogLevel.Debug); socket.SendPackage(resultMessage); }).Start(); } else { new Task(async() => { await this.OnStreaming.Invoke(package, socket.SocketStream); }).Start(); } } } catch (Exception ex) { this.Log("Socket stream error", ex); } } this.OnClientDisconnected?.Invoke(socket.SocketStream.ClientId); this.Log(this.ToString(), "Client connection closed", LogLevel.Info); }