/** * Async callback that gets called when we have read something from the stream. */ private void OnRead(IAsyncResult ar) { try { var lengthPreFix = BitConverter.ToInt32(buffer); var receivedBytes = ReadTotalBytes(lengthPreFix); dynamic receivedData; if (keyExchanged) { receivedData = JsonConvert.DeserializeObject(decryptor.DecryptAes(receivedBytes, 0, lengthPreFix)); } else { var receivedText = Encoding.ASCII.GetString(receivedBytes, 0, lengthPreFix); receivedData = JsonConvert.DeserializeObject(receivedText); } HandleData(receivedData); stream.BeginRead(buffer, 0, buffer.Length, OnRead, null); } catch (IOException) { OnDisconnect(); } }