/// <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; } }
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) { } } } } }