Exemple #1
0
        /// <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);
            });
        }
Exemple #2
0
        /// <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);
        }