2012-02-01 1 views
0

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

Вот что я имел:

 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); 
      } 
     } 

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

Я попытался это:

 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"); 
     } 

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

ТИА

+0

Как именно он не работает? Вы не дали нам достаточной информации для работы. –

+0

Как выглядит сообщение? Это фиксированная длина? Это префикс длины? Является ли это символом новой строки (предположим, что это может быть текст)? – MarkPflug

+0

В вашей второй части кода нет понятия сообщения. Я имею в виду, что часть while будет непрерывно считывать данные до тех пор, пока клиент не закроет соединение, поскольку он не проверяет наличие разделителей во входящем потоке данных или что-то еще. – user1096188

ответ

0

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

+0

Удивительный ... Я почти там. t полностью уверен, как заполнить массив byte [] вместо добавления данных в строку. Я попытался создать список и добавить (myReadBuffer, 0, numberofBytesRead) мышление, которое было байтом, но это не так. –

+0

В итоге я просто запустил memystring.write() и преобразовал его в массив ... может быть, не самое чистое решение, но оно работает. Благодаря! –

3

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

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; 
     }