Чтение данных из NetworkStream - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь отправить много данных (изображений) на NetworkStream, но, похоже, одного Read недостаточно - я хотел бы попробовать прочитать все данные, отправленные на NetworkStream, но я понятия не имею, как это сделать. Кроме того, я хотел бы иметь эти данные в виде байтового массива byte[]. Есть идеи, как это сделать?

byte[] b = new byte[length];
int bytes = 0;
while (!GetNetworkStream().DataAvailable)
    Thread.Sleep(20); // Some delay
bytes = GetNetworkStream().Read(b, 0, b.Length);
MemoryStream ms = new MemoryStream();
ms.Write(b, 0, bytes);

Я также попробовал следующий код, который, кажется, не работает:

using (NetworkStream stream = CommunicationHandler.GetStream())
{
    byte[] data = new byte[1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int numBytesRead;
        while ((numBytesRead = stream.Read(data, 0, data.Length)) > 0)
        ms.Write(data, 0, numBytesRead);
    }
}

1 Ответ

1 голос
/ 27 мая 2019

Как я вижу, вы добавили сюда несколько методов, которые вы создали самостоятельно, и я полагаю, у вас нет проблем с чтением данных.Что вам действительно нужно, так это какой-то дескриптор при запуске нового файла, потому что ваш сокет должен непрерывно получать данные.

Очевидно, это зависит от того, какой формат изображения вы хотите использовать, что вы хотите отправить.Для файлов PNG вы должны прочитать главу 12 этого pdf файла.Особенно раздел 12. Вы можете искать сигнатуру и извлекать данные из буфера, если вы нажмете последовательность вроде этой

(decimal)             137 80 78 71 13 10 26   10
(hexadecimal)          89 50 4e 47 0d 0a 1a   0a
(ASCII C notation)   \211 P  N   G \r \n \032 \n

Тогда вам нужно просто воссоздать файл png.Вы должны делать то же самое с каждым типом файла, который вы отправляете.

Если вы не заботитесь о содержимом файла, вы могли бы создать некоторый фрейм данных и поместить данные в полезную нагрузку (сжатые и зашифрованные).Создать собственную подпись, бла-бла-блах.Простейший пример - Modbus.Подробнее об этом можно прочитать здесь .

edit

Чтение данных из tcp stream очень просто.Просто посмотрите на этот код.

var receiveBufferSize = 512; // amount of bytes to read
try
{
    var buffer = new byte[receiveBufferSize];
    _tcpClient.GetStream().Read(buffer, 0, receiveBufferSize);
    // handle the received data chunk
}
catch (Exception e)
{
    // handle the error
    Debug.WriteLine(ex.Message);
}
...