Каков точный метод отправки изображения по сети [попытка с использованием сокетов] - PullRequest
0 голосов
/ 24 февраля 2012

Это мой код на стороне сервера:

        public void ReceivingData(object sender, EventArgs e)
        {
            while (mysocket.Connected)
            {
                buffer = new byte[accepted.SendBufferSize];
            int bytesRead = accepted.Receive(buffer);
            MemoryStream Data = new MemoryStream(buffer);
            if ( picbox.InvokeRequired)
            {
                picbox.Invoke(new MethodInvoker(delegate { picbox.Image = Image.FromStream(Data); }));
            }
            }
        }

Соединение устанавливается и файл принимается без каких-либо проблем.Однако изображение переносится при передаче.Я не понимаю, почему это происходит.Вот скриншот: enter image description here

Я помню, что мне пришлось форматировать строки, которые я использовал для отправки через сокеты, используя Encoding.ASCII.GetString (StringToFormat).Что мне нужно делать в случае изображений?

1 Ответ

0 голосов
/ 24 февраля 2012

При вашем ReceivingData обратном вызове вы можете не получить все данные обратно в одном щелчке.Некоторые данные могут быть получены частично, а остальные - в последующих (или множественных) обратных вызовах, и ваша задача будет собрать оригинальное сообщение.

Вам потребуется определить протокол, чтобы убедиться, что вы прочитали все необходимые данные.Например, вы можете использовать base64 для кодирования изображения на сервере и декодирования его на клиенте.Вам нужно знать, сколько байтов вы должны ожидать.Это можно сделать, либо добавив в ответ префикс к общему количеству байтов, которые должен ожидать клиент, либо с помощью специального маркера (например, значение байта 0x00) для различения границ сообщения.

Использование Base64 также будет иметь эффектувеличение размера файла на 33%, поскольку base64 в основном кодирует каждые 6 бит входящего потока в 8-битный читаемый символ.Таким образом, для каждых 3 «реальных» байтов, которые вы хотите передать, вам потребуется 4 закодированных байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...