Вообще, это хорошая идея. Вы создали простой протокол, который записывает префикс длины перед данными, чтобы вы знали, сколько читать. Это очень распространено, просто и эффективно.
Вы можете значительно упростить код. BinaryReader
имеет методы для чтения и записи целых чисел и байтовых массивов. Вы можете прочитать байтовый массив точного размера. BinaryReader
делает цикл за вас.
Если вы не хотите использовать BinaryReader
в образовательных целях, сделайте себе вспомогательную функцию, которая считывает точное количество байтов.
Я бы основывал TcpMessageStream
на Stream
, а не на TcpClient
. Это делает его более общим.
Асинхронное использование правильное.
Шаблон утилизации, который вы использовали, здесь бесполезен. Финализатор ничего не делает, и никогда не будет наследников. Нет необходимости в этом логическом флаге disposed
. Напишите обычный void Dispose()
метод, который просто делает то, что нужно.
В целом это очень хорошая работа. Сетевой код очень сложный.
Если это часть реального приложения, вообще не пишите свой собственный сетевой протокол. Попробуйте использовать HTTP или веб-сокеты. Поднимитесь как можно выше в стеке абстракций.