2010-09-07 12 views
1

Je n'arrive pas à transférer un fichier à un client à partir d'un programme serveur. Quelques problèmes que j'aimerais aborder. La première est que je fais le tableau d'octets 6000 octets grand et c'est toujours cette taille. Y a-t-il un moyen de maintenir la bonne taille de fichier? Aussi avec la façon dont le code est maintenant, le programme se bloque. Cela fonctionne quand je le retire de la boucle while du côté client. Aidez-moi!!Utilisation d'un NetworkStream pour transférer un fichier

Client:

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

    } 

} 

Serveur:

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

EDIT !!!: Je résolu le problème en boucle.

Répondre

1

Le programme bouclera pour toujours si CanRead reste faux tant que i est différent de zéro. Ou, il peut être bloqué lors de l'appel Read.

Déboguez votre côté de réception pour savoir ce qui se passe. Est-ce vraiment accroché, ou juste en boucle?

Ajouter du code pour vider les données envoyées et reçues à chaque extrémité pour voir jusqu'où vous avez lu OK avant que les problèmes surviennent.

2

Un problème est que vous écrivez les 6000 octets entiers dans le flux même si vous ne lisez qu'un octet à partir du fichier.

Utilisez un FileStream pour accéder au fichier et copier le contenu sur NetworkStream. Framework 4.0 a une fonction bien pour cette

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

Vous pouvez adopter une approche similaire pour le côté client, juste en sens inverse, copier NetworkStream à la cible Stream.

Avant Framework 4.0, vous pouvez implémenter votre propre fonction CopyTo. Quelque chose comme ça

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

Je en ai besoin de coller à .Net 3.5 –

+0

@Sean P, I a ajouté un exemple d'implémentation pour une 3,5 fonction CopyStream compatible. Ceux-ci peuvent être trouvés partout sur Internet, ils sont à la pelle. –

+0

Je pense que vous avez peut-être mal compris ma question. Je n'ai aucun problème pour faire passer le fichier. Mon problème est que le fichier est toujours le byte []. Y at-il un moyen de réduire à la taille réelle? Je suis en train de débattre en passant d'abord la taille du fichier puis en initialisant l'octet [] à la bonne taille. –

Questions connexes