создать «слушатель» для входящего потока сокетов, который будет содержать массив byte [] - PullRequest
0 голосов
/ 01 февраля 2012

Я создаю сервер сокетов, который должен постоянно прослушивать входящие сообщения от подключенных клиентов.Эти сообщения будут отправлены в массиве byte [].У меня был сервер, отлично работающий с StreamReader, но StreamReader работает только с текстовыми представлениями отправляемых данных ... но не с байтами [].

Вот что у меня было:

        StreamReader reader = new StreamReader(Client.GetStream());
        string line = "";
        while (true)
        {
            line = reader.ReadLine();
            if (!string.IsNullOrEmpty(line))
            {
                parentForm.ApplyText(line + "\r\n");
                SocketServer.SendBroadcast(line);
            }
        }

Теперь мне нужно каким-то образом преобразовать это в необработанный поток, который преобразует содержимое потока в массив byte [], но я не могу понять, как это сделать.

Я пробовал это:

        while (true)
        {
            var bytes = default(byte[]);
            using (var memstream = new MemoryStream())
            {
                var buffer = new byte[512];
                var bytesRead = default(int);
                while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
                    memstream.Write(buffer, 0, bytesRead);
                bytes = memstream.ToArray();
            }
            //parentForm.ApplyText(bytes.Length + "\r\n");
        }

но, как вы можете догадаться, цикл while (true) не совсем работает так, как мне нужно.Может кто-нибудь помочь мне с некоторой корректировкой кода, чтобы сделать эту работу, как мне нужно.Он должен постоянно прослушивать входящие сообщения, затем, когда сообщение получено, ему нужно что-то делать с этим сообщением (массив byte []), а затем снова вернуться к прослушиванию.

TIA

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Я полагаю, что «постоянно слушать» - это не задача читателя, а задача слушателя.Я столкнулся с той же проблемой, когда я писал сервер с использованием TcpListener.Я не уверен, что вы хотите сделать, но я выкладываю решение для вашей проблемы "непрерывного прослушивания" и чтения в byte [].Я думаю, этот код может помочь вам:

TcpListener t = new TcpListener(IPAddress.Loopback, _port);
        t.Start();

        Console.WriteLine("Server is started and waiting for client\n\n");

        byte[] buff = new byte[255];
        NetworkStream stream;
        TcpClient client;
        while(true)
        {
            client = t.AcceptTcpClient();
            if (!client.Connected)
               return;

            stream = client.GetStream();
            while ((stream.Read(buff, 0, buff.Length)) != 0)
            {
                break;
            }

            if (0 != buff.Length)
                break;
        }  
0 голосов
/ 01 февраля 2012

Нет необходимости конвертировать что-либо. GetStream() возвращает NetworkStream. См. Пример, который Microsoft включает в метод NetworkStream.Read . Все, что вам нужно сделать, это заменить строку myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); соответствующим механизмом хранения.

...