Если вы используете TCP, протокол заботится о порядке, ретрансляции и т. Д.
Что касается отправки / получения данных динамически, вы можете использовать префиксный протокол, в котором вы сначала отправляете номер (например,int - 4 байта), который представляет длину сообщения, которое должно прибыть.После этого вы отправляете оставшуюся часть сообщения.
Получатель ожидает 4 байта, затем преобразует их в целое число и ожидает такого количества байтов.Этот процесс повторяется снова и снова.
В вашем случае нет смысла сначала читать 16 байтов, разбирать их в строку, а затем разбирать строку в int.Ваш отправитель может сразу преобразовать int в байты следующим образом:
// lengthBytes.Length = 4 bytes, which is sizeof(int)
byte[] lengthBytes = BitConverter.GetBytes(anInt);
конец и затем отправить его по проводам.
Затем, на принимающей стороне, в вашем коде вам нравится:
byte[] msgLengthBytes = new byte[sizeof(int)]; // or hardcode 4 here, I'm a generalization junkie
stream.Read(msgLengthBytes, 0, msgLengthBytes.Length);
int msgLength = BitConverter.GetInt32(msgLengthBytes, 0);
Кроме того, вместо того, для которого предполагается, что каждый раз, когда вы читаете из потока, вы читаете именно то количество байтов, которое вы ожидаете, вы должны использовать что-то вроде этого:
int transfered = 0;
while (transfered < msgLength)
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, bytesRead);
transfered += bytesRead;
progress += (bytesRead / msgLength) * 100;
ChangeProgress(progress); // You can't use int here anymore, use Math to round or something, for your progress bar
}
Кроме того, в моем фрагменте возможно, что при последней операции приема вы прочитаете такую сумму, как: transfered + bytesRead> msgLengh, если вы отправляете данные непрерывно в потоке.Вы также должны позаботиться об этом.
Во всяком случае, если бы я был вами и потому, что вам нужен какой-то уведомитель о прогрессе, я бы использовал поток с асинхронной BeginRead ().
Я только что дал вам идею, вы можете настроить ее по своему желанию.