Использование NetworkStream для передачи файла - PullRequest
1 голос
/ 08 сентября 2010

У меня проблемы с передачей файла клиенту из серверной программы.Несколько проблем, которые я хотел бы решить.Во-первых, я делаю байтовый массив размером 6000 байтов, и его размер всегда такой.Есть ли способ сохранить правильный размер файла?Также с тем, как код сейчас, программа зависает.Это работает, когда я вынимаю его из цикла while на стороне клиента.Помогите !!

Клиент:

 private void button1_Click(object sender, EventArgs e)
    {   
        BinaryWriter binWriter; 
        int i = -1;
        Byte[] bytes = new Byte[6000];

        NetworkStream clientStream = connTemp.GetStream();
        byte[] outstream = Encoding.ASCII.GetBytes(txtMessage.Text);
        clientStream.Write(outstream, 0, outstream.Length);


        while (i != 0)
        {
            try
            {
                if (clientStream.CanRead)
                {
                    i = clientStream.Read(bytes, 0, bytes.Length);

                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                break;
            }
        }


        binWriter = new BinaryWriter(File.Open("C:\\SeanLaunch\\log.rxlog",FileMode.Create));
        binWriter.Write(bytes);
        binWriter.Close();

    }

}

Сервер:

  Byte[] fileToSendAsByteArray = new Byte[6000];
  fileToSendAsByteArray = File.ReadAllBytes("C:\\Launch\\Test.rxlog");
  stream.Write(fileToSendAsByteArray, 0, fileToSendAsByteArray.Length);

РЕДАКТИРОВАТЬ !!!: Я исправил проблему с циклом

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Одна проблема заключается в том, что вы записываете в поток все 6000 байтов, даже если вы читаете только один байт из файла.

Используйте FileStream для доступа к файлу и копирования содержимого в NetworkStream. Framework 4.0 имеет хорошую функцию для этого

FileStream fs = new FileStream(...);
fs.CopyTo(stream);

Вы можете использовать аналогичный подход для клиентской стороны, наоборот, скопировать из NetworkStream в целевой поток.

До Framework 4.0 вы могли реализовать собственную функцию CopyTo. Как то так

public static long CopyStream(Stream source, Stream target)
{
  const int bufSize = 0x1000;
  byte[] buf = new byte[bufSize];

  long totalBytes = 0;
  int bytesRead = 0;

  while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
  {
    target.Write(buf, 0, bytesRead);
    totalBytes += bytesRead;
  }
  return totalBytes;
}
1 голос
/ 08 сентября 2010

Программа зациклится навсегда, если CanRead останется ложным, пока я не равен нулю.Или это может быть заблокировано на вызове Read.

Отладка принимающей стороны, чтобы узнать, что происходит.Это действительно зависает или просто зацикливается?

Добавьте код для вывода данных, отправленных и полученных на каждом конце, чтобы увидеть, как далеко вы прочитали OK, прежде чем возникнут проблемы.

...