Документация TCPClient от Microsoft на самом деле очень полезна.
Как читать данные из TCPClient
Ключевая часть вПример Microsoft для чтения данных из сокета:
// Get the stream
NetworkStream stream = client.GetStream();
Byte[] data = new Byte[256];
// String to store the response ASCII representation.
String responseData = String.Empty;
// Read the first batch of the TcpServer response bytes.
int bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
Они используют метод GetStream класса TCPClient и читают все доступные данные (додо 256 байт) из потока.
Это немного обманывает, так как они просто получают одну партию данных и предполагают, что это полное и правильное сообщение.Он будет работать нормально, если ваш клиент на 100% предсказуем, так как он всегда отправляет одно и то же, а затем отключается.
Лучший способ справиться с этим ниже ...
Как сделатьВы знаете, получено ли сообщение?
Вы не получаете, вы просто продолжаете получать данные, пока их больше нет, затем проверяйте, что вы получили (или проверяйте по ходу).
Чтобы сделать это, вы должны спроектировать сообщение так, чтобы оно включало какой-либо способ определения длины (целое число в начале, указывающее длину), или иметь некоторый маркер конца сообщения (например, возврат каретки), или иметь сообщение фиксированной длины.
Например, ваша спецификация сообщения может быть такой:
ДАННЫЕ привет друг
END
При поиске END следуютпри возврате каретки вы узнаете, что нашли конец сообщения.Аналогичным образом, маркер DATA
в начале помогает вам определить, где начинается сообщение, и разделить данные сообщения.
Как лучше всего читать эти данные?
Все отправленные / полученные данные будут в двоичном формате, вам необходимо кодировать и декодировать данные.В этом примере они преобразуют двоичные данные в строку (и наоборот), используя встроенные методы кодирования ASCII GetString и GetBytes .
Рассмотрите возможность реализации известного протокола
Я бы порекомендовал (где это возможно) использовать установленный протокол, а не просто отправлять обычный текст по TCP.Существуют стандарты практически для всего, и любому, кто подключается к вашему приложению, будет легче следовать известному и определенному стандарту.
Существует также множество готовых библиотек для часто используемых протоколов, которые избавят вас и ваших клиентов от неприятностей.