Esempio n. 1
0
        protected void ProcessMessage(WebSocketClient client, IEnumerable <WebSocketFrame> messages)
        {
            if (messages is null)
            {
                return;
            }

            foreach (var message in messages)
            {
                switch (message.Code)
                {
                case WebSocketFrame.OpCode.ContinuationFrame:
                    break;

                case WebSocketFrame.OpCode.TextFrame:
                    if (message.Data.Length > 0)
                    {
                        Task.Run(() => MessageReceived?.Invoke(this, new MessageReceivedArgs()
                        {
                            Client  = client,
                            Message = Encoding.UTF8.GetString(message.Data)
                        }));
                    }
                    break;

                case WebSocketFrame.OpCode.BinaryFrame:
                    break;

                case WebSocketFrame.OpCode.ConnectionClose:
                    client.Dispose();
                    Clients.Remove(client);
                    Console.WriteLine("Client " + client.Id + " closing...");
                    break;

                case WebSocketFrame.OpCode.Ping:
                    client.Send(new WebSocketFrame()
                    {
                        Code = WebSocketFrame.OpCode.Pong
                    });
                    break;

                case WebSocketFrame.OpCode.Pong:
                    Console.WriteLine("Pong received.");
                    break;

                default:
                    Console.WriteLine("Not supported command.");
                    break;
                }
            }
        }
        private void ProcessConnection(WebSocketClient client)
        {
            try
            {
                client.UpgradedConnection = ProcessWebsocketUpgrade(client);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

                client?.Dispose();

                Clients.Remove(client);

                return;
            }

            if (client.UpgradedConnection)
            {
                Task
                .Delay(ClientUpgradeTimeout)
                .ContinueWith(t => OnClientConnected(client));
            }
        }