示例#1
0
        /// <summary>
        /// Reads next message from stream
        /// </summary>
        protected override async Task Read()
        {
            WebSocketReader  reader  = new WebSocketReader();
            WebSocketMessage message = await reader.Read(Stream);

            if (message == null)
            {
                Disconnect();
                return;
            }

            KeepAlive();
            switch (message.OpCode)
            {
            case SocketOpCode.Binary:
            case SocketOpCode.UTF8:
                SetOnMessageReceived(message);
                break;

            case SocketOpCode.Terminate:
                Disconnect();
                break;

            case SocketOpCode.Pong:
                break;

            case SocketOpCode.Ping:
                Pong();
                break;
            }
        }
示例#2
0
        private void ListenClient(WebSocketClient client)
        {
            using (Stream ns = GetStream(client)) {
                client.Stream = ns;

                WebSocketReader reader = new WebSocketReader();

                string header        = HttpUtils.ReadHeader(ns);
                Regex  getRegex      = new Regex(@"^GET(.*)HTTP\/1\.1", RegexOptions.IgnoreCase);
                Match  getRegexMatch = getRegex.Match(header);

                if (getRegexMatch.Success)
                {
                    DoHandshake(ns, header);
                    client.Writer = new WebSocketWriter(ns);

                    Clients.Add(client);
                    OnConnect?.Invoke(client);
                }
                else
                {
                    RemoveClient(client);
                }

                while (Running && Clients.IndexOf(client) != -1)
                {
                    WebSocketFrame frame = reader.Read(ns, client);

                    if (frame == null || frame.Opcode == WebSocketOpcode.ConnectionCloseFrame)
                    {
                        RemoveClient(client);
                        break;
                    }

                    if (frame.Opcode == WebSocketOpcode.PongFrame)
                    {
                        client.Pong = true;
                    }
                    else if (frame.Opcode == WebSocketOpcode.TextFrame)
                    {
                        try {
                            string json = Encoding.UTF8.GetString(frame.Data);

                            var message = JsonConvert.DeserializeObject <WebSocketMessage>(json);

                            On[message.ID]?.Invoke(client, new MessageEventArgs(message));
                        } catch (Exception e) { }
                    }
                }
            }
        }