// Checks for new incoming messages and handles them // This method will handle one Packet at a time, even if more than one is in the memory stream private async Task _handleIncomingPackets() { try { // Check for new incomding messages if (_client.Available > 0) { // There must be some incoming data, the first two bytes are the size of the Packet byte[] lengthBuffer = new byte[2]; await _msgStream.ReadAsync(lengthBuffer, 0, 2); ushort packetByteSize = BitConverter.ToUInt16(lengthBuffer, 0); // Now read that many bytes from what's left in the stream, it must be the Packet byte[] jsonBuffer = new byte[packetByteSize]; await _msgStream.ReadAsync(jsonBuffer, 0, jsonBuffer.Length); // Convert it into a packet datatype string jsonString = Encoding.UTF8.GetString(jsonBuffer); Packet packet = Packet.FromJson(jsonString); // Dispatch it try { await _commandHandlers[packet.Command](packet.Message); } catch (KeyNotFoundException) { } //Console.WriteLine("[RECEIVED]\n{0}", packet); } } catch (Exception) { } }