2017-01-14 2 views
1

Я изучал, как использовать TcpClients в C# в течение последних нескольких дней, и смог отправлять строки (сообщения) по tcp. Сегодня я решил попробовать отправить текстовый файл (т. Е. Клиент получит файл и напишет его в ту же папку). Он работал, за исключением одной проблемы: после сообщения есть TON нулевых байтов. Вот что я имею в виду:Множество лишних байтов при отправке файла через TCP

Подлинные содержимое текстового файла: http://i.imgur.com/UCO3jvL.png

Получено содержимое текстового файла: http://i.imgur.com/6vucz40.png

Я посмотрел на размер полученного файла, а длина была 65536 символов. Я знаю, что максимальный размер TCP-пакета составляет 65535, поэтому то, что я думаю, является чем-то в моем коде, заставляет его использовать максимальный размер пакета, а не только необходимую ему сумму.

Вот мой код с сервера, который отправляет файл клиенту:

 if(message.Contains("getFile")) 
     { 
      byte[] fileBytes = File.ReadAllBytes("text.txt"); 
      stream.Write(fileBytes, 0, fileBytes.Length); 
     } 

Вот мой код клиента, который получает файл с сервера и записывает его на диск:

 if(command.Contains("getFile")) 
     { 
      byte[] readBuffer = new byte[client.ReceiveBufferSize]; 
      int data = stream.Read(readBuffer, 0, readBuffer.Length); 
      File.WriteAllBytes("file.txt", readBuffer); 
     } 
+0

его не о ТСР вообще я думаю, насколько велик ваш 'client.ReceiveBufferSize'? вы напишете столько байтов в свой файл –

+0

Клиент.RecieveBufferSize должен быть установлен так же, как длина файла, если я не ошибаюсь? – rrrrrrrrrrrrrrrr

ответ

2

Ваша проблема заключается в том, что вы полностью игнорируя количество данных, которые вы получили от сети, даже если вы пропустите сеть и просто сделать:

byte[] readBuffer = new byte[client.ReceiveBufferSize]; 
File.WriteAllBytes("file.txt", readBuffer); 

вы получите файл с кучей нулей.

Вы должны принять во внимание возвращаемое значение stream.Read:

using (BinaryWriter binWriter = new BinaryWriter(File.Open("file.txt", FileMode.Create))) 
{ 
    binWriter.Write(readBuffer, 0, data); 
} 
+0

Спасибо! Это решило это, но не могли бы вы объяснить, как я «полностью игнорирую амонуты данных, которые вы получили от сети»? Я немного смущен, что вы подразумеваете – rrrrrrrrrrrrrrrr

+0

, 'stream.Read' возвращает количество байтов, которые он читает из сети, но вы никогда не использовали этот номер. Независимо от того, сколько байтов вы действительно получили, вы все еще вызывали «WriteAllBytes», который записывает столько, сколько там, в выделенном буфере. То почему я спрашивал вас о размере буфера, где вы получили 'client.ReceiveBufferSize' это? –

+0

Ahhhh, я понимаю, что вы имеете в виду - я ничего не делал с переменной «data». Я полагаю, что File.WriteAllBytes не подходит для этой ситуации. – rrrrrrrrrrrrrrrr

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