2014-02-20 6 views
0

Вот мой метод для передачи данных:Как я могу отправить byte [] с StreamWriter?

// this method serializes an object and is returned as a string (Base64 encoded) 
    public void Send(Packet packetData) 
    { 
     try 
     { 
      StreamWriter w = new StreamWriter(cli.GetStream()); 
      string s = SerializeObject(packetData); 
      w.WriteLine(s + "\n"); 
      w.Flush(); 
     } 
     catch (ObjectDisposedException) { ShutdownClient(-2); } 
    } 
  • кли является объектом TcpClient
  • Пакетная сериализации объекта

Вот мой получить метод:

private string GetMessage(StreamReader r) 
    { 
     try 
     { 
      string s = r.ReadLine(); 
      s = s.Replace(" ", ""); 

      // this string is returned and then deserialized 
      return s; 
     } 
     catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message); return null; } 
    } 

Когда Я использую это, в 50% случаев, когда он работает. Если это не работает, из-за этого: «Входной поток не является допустимым двоичным форматом. Начальное содержимое (в байтах): 6D-2E-44-72-61-77-69-6E- 67-2E-43-6F-6C-6F-72-0F-00 ...»

Я попытался с помощью Encoding.Default.GetString/GetBytes в замене Base64, но затем я получаю это: «Двоичный поток« 0 »не содержит допустимого BinaryHeader. Возможными причинами являются недопустимый поток или изменение версии объекта между сериализацией и десериализацией». Если я распечатаю длину этой (по умолчанию кодированной) строки, она равна 183. Но если я распечатаю фактическую строку, ничего не будет напечатано.

Как еще я могу отправить байт [] в виде строки поверх StreamWriter?

+0

Использование метода streamWriter.BaseStream.Write –

+0

Вы пытались использовать определенную кодировку с обоих концов? таких как UTF8 или ASCII? –

+0

Также почему вы удаляете символы из потока на своем получателе? –

ответ

2

Как еще я могу отправить байт [] в виде строки

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

Если использование строки имеет первостепенное значение, вы должны использовать Convert.ToBase64String() в передатчике Convert.FromBase64String() на принимающей стороне.

Имейте в виду, что TCP полностью способен передавать двоичные данные. Возможно, вы попали в эту дыру, потому что TCP реализует поток , он ничего не делает, чтобы помочь вам передать сообщений. Простым способом передачи двоичного «сообщения» является запись длины байта []. Получатель сначала прочитал эту длину, затем знает, что он должен передать вызову Read() для восстановления байта [] назад из потока TCP.

+0

Благодарим вас за разъяснения.Я делаю именно это, но иногда количество прочитанных данных на 2 или 3 байта меньше, чем должно быть, почему это происходит? – Daaksin

+0

Вы не можете читать «меньше» при подсчете каждого байта. Игнорирование возвращаемого значения Read() является стандартной ошибкой. –

+0

Вы уверены? Вот журнал чтения: – Daaksin

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