Как отправить поток памяти с использованием сокетов C #? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь написать код для сервера-сокета, который отправляет содержимое MemoryStream по сети, используя System.Net.Sockets.Я попробовал приведенный ниже код для отправки содержимого потока памяти, который не является нулевым, но программа не работала.В чем проблема с кодом и как я могу ее решить, и если есть другой способ, вы можете мне помочь?

C # код для клиента:

    using (var ms = new MemoryStream())
        {
            byte[] buffer = new byte[1024];
            int read = 0;
            while ((read = NetStream.Read(buffer, 0, 1024)) != 0)
            {
                ms.Write(buffer, 0, read);
            }
            ms.Position = 0;
            stream.Close();
            client.Close();
            return ms;
        }

C # код для сервера:

            byte[] buffer = new byte[1024];
            MemoryStream ms = new MemoryStream();
            ms = response; //response is also NOT null MemoryStream
            ms.Position = 0;

            int read = 0;
            while ((read = ms.Read(buffer, 0, 1024)) != 0)
            {
                stream.Write(buffer, 0, read);
            }
            ms.Close();
            response.Close();
            stream.Flush();
            Console.WriteLine("DONE.");

Результаты отладчика: сервер немедленно продолжает выполнение программы, а клиентзастрял.

ПРИМЕЧАНИЕ : идентификатор кода из этого ответа: DataSet & NetworkStream в C #

1 Ответ

0 голосов
/ 12 февраля 2019

Я понял это по ответам здесь:

Во-первых, дождитесь данных от отправителя (относится к обоим циклам), а во-вторых, сразу после прочтения проверьте, доступны ли еще данные.таким образом, он ничего не ждет.

while (true)
{
    if (clientStream.DataAvailable)
            {
                while ((i = clientStream.Read(bytesBuffer, 0, bytesBuffer.Length)) != 0)
                {
                    memoryStream.Write(bytesBuffer, 0, bytesBuffer.Length);
                    if (clientStream.DataAvailable)
                        continue;
                    else
                        break;

                }
                Console.WriteLine("Received from server {0}", Encoding.ASCII.GetString(memoryStream.ToArray()));
                break;
            }
            else
            {
                continue;
            }
    }

Спасибо!

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