2016-06-15 6 views
-1

В настоящее время я получаю данные всякий раз, когда это 17 байт. Однако у меня есть два типа данных: 17 байт и 10 байт. Как я могу обработать его, когда у меня есть два типа данных?Получение данных клиента TCP

 byte[] message = new byte[17]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 17); 

      } 
      catch 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

Я видел похожие вопросы, но это на C, и я не мог понять. Пожалуйста, помогите мне.

+1

Для формирования кадрирования сообщений необходим протокол приложения. Вы предполагаете, что получаете 17-байтовое сообщение, но вы вполне можете читать 10-байтовое сообщение и первые 7 байтов следующего сообщения. Мы не можем ответить на это за вас. – CodeCaster

+1

Вы можете позволить своим типам данных быть 18 и 11 байтами. Первый байт будет идентификатором. Вы читаете один байт, проверяете его на тип сообщения, чтобы узнать, нужно ли читать 10 или 17 байт. Затем вы читаете свои данные. – Holger

+0

@CodeCaster Спасибо. Попробуй свое предложение. – active92

ответ

2

Вы пытаетесь реализовать обмен сообщениями над потоковым протоколом (например, TCP). Когда сообщения имеют разную длину и/или типов, есть два общих подхода

  • обрамленные сообщения: Каждое сообщение будет состоять из заголовка известной длины, который содержит длину и тип и, возможно, другие метаданные о сообщении (например, метка времени). После считывания заголовка из потока считывается соответствующее количество байтов (т. Е. Полезная нагрузка).
  • сообщения с саморазметкой: конец сообщения может быть обнаружен содержимым потока, считанного до сих пор. Одним из примеров саморазграничения является HTTP-заголовок, который разделяется двойной новой строкой (2x CRLF).

IMHO оснащенный обмен сообщениями проще реализовать, поскольку вы всегда знаете, сколько байтов читать. Для сообщений с саморазграничением вы должны использовать буферизацию и синтаксический анализ для обнаружения конца сообщения. Кроме того, вы должны убедиться, что маркер конца сообщения не отображается в полезной нагрузке сообщения.

Для реализации принимающей стороны протокола обмена кадрами вы можете использовать класс System.IO.BinaryReader.

  • прочитать длину сообщения, используя ReadByte() или один из методов ReadUInt*(), если сообщения станут длиннее, чем 255 байт
  • чтения полезной нагрузки с использованием Read(Byte[], Int32, Int32). Обратите внимание, что Read может возвращаться, даже если чтение меньше байта, чем указано. Вы должны использовать цикл для заполнения byte[] message.
+0

Большое спасибо за подробное объяснение. Я решил реализовать обрамленные сообщения, поскольку в моем случае это намного удобнее. – active92

 Смежные вопросы

  • Нет связанных вопросов^_^