2010-11-22 25 views
0

I. IntroductionTransfert de fichiers TCP Problème

Je suis en train d'ouvrir et de lire à partir d'un fichier, en envoyant des blocs de données via un socket TCP pendant que je lis.

CODE ÉMETTEUR

byte[] buffer = new byte[16384]; 
while ((in.read(buffer)) > 0) 
{ 
    SendProtocol(new FileTransfer(sender, receiver, buffer); 
} 

RÉCEPTEUR CODE

if(o instanceOf FileTransfer) 
    FileTransfer tf = (FileTransfer) o; 
    out.write(tf.getData); 
} 

II. Problème

Après avoir envoyé le protocole via le socket TCP, je vois les octets envoyés. Ils sont tous uniques. MAIS du côté du récepteur, les octets reçus sont exactement les mêmes octets [] à plusieurs reprises.

III. Exemple

SENDER BYTES 
[3, 3, 5, -44, 4, 3]  
[99, -3, 5, -44, 7, 3] 
[-11, 3, 5, -44, 4, 7] 
[10, 6, 5, -44, 4, 66] 

RECEIVER BYTES 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
+0

Quelle est votre classe '' SendProtocol' et FileTransfer'? Ils ne sont pas la bibliothèque java standard. –

+0

SendProtocol est une fonction dans la classe de réseau de mes clients qui délègue toute la connectivité TCP des sockets ect. Boucle d'écoute pour les protocoles avec des flux d'entrée et de sortie. Ma classe FileTransfer n'est pas une bibliothèque Java standard, c'est un objet de classe sérialisable qui contient, expéditeur, destinataire et octets. (Y a-t-il une meilleure façon de faire cela O_O)? – user515574

Répondre

0

d'utiliser après avoir écrit toutes les informations.

+0

Et n'oubliez pas 'out.close();' lorsque vous avez terminé avec le flux de sortie. – bakoyaro

+0

J'ai vérifié deux fois que j'ai fait les deux, donc je suis toujours perplexe pourquoi cela ne fonctionne pas. – user515574

0

Qu'est-ce que FileTransfer, et son constructeur copie-t-il le tampon? Son fonctionnement est-il asynchrone? Il se peut que son tampon soit rechargé par la boucle avant d'avoir été copié sur le socket TCP. C'est-à-dire que vous continuez à mettre en file d'attente des pointeurs vers le même tampon, que vous écrasez ensuite dans la boucle.

Assurez-vous que FileTransfer assume la propriété du paramètre de mémoire tampon, en le supprimant lors de l'envoi. Ensuite, attribuez-en un nouveau pour chaque voyage à travers la boucle et remettez-le au FileTransfer.

+0

Je vais essayer ça. J'ai exécuté mon code séparément, en dehors du programme, et ça marche comme je le veux, mais c'est sûr que j'essaie ça. – user515574

+0

Mise à jour: Je viens de faire un forloop et copié le tampon dans un nouveau tampon et l'a envoyé. Est-ce une bonne façon de le faire? Ça marche. – user515574

2

Un problème que vous avez, c'est que vous ne vérifiez pas combien d'octets vous avez reçu. Il se peut que vous obteniez un tampon complet presque à chaque fois sur le bouclage, mais il est peu probable que vous ayez un vrai réseau. Vous devez enregistrer le nombre d'octets lus dans le tampon et n'utiliser que cette quantité.

2

Peut-être cet exemple de test, je l'ai fait clairement ce que vous avez manqué:

public class Test { 
    public static void main(String args[]) throws Exception { 

     Server server = new Server(12345); 

     Socket s = null; 
     InputStream fs = null; 
     try { 
      s = new Socket("localhost", 12345); 
      fs = new FileInputStream("test.txt"); 

      OutputStream os = s.getOutputStream(); 
      byte[] bytes = new byte[1024]; 
      int read; 
      while ((read = fs.read(bytes)) != -1) 
       os.write(bytes, 0, read); 
     } 
     finally { 
      if (s != null) 
       s.close(); 
      if (fs != null) 
       fs.close(); 
     } 


     server.join(); 
    } 

    static class Server extends Thread { 

     ServerSocket serverSocket; 

     Server(int port) throws IOException { 
      serverSocket = new ServerSocket(port); 

      start(); 
     } 

     @Override 
     public void run() { 
      try { 
       Socket s = serverSocket.accept(); 

       InputStream is = s.getInputStream(); 

       try { 

        StringBuffer sb = new StringBuffer(); 
        { 
         byte[] bytes = new byte[1024]; 
         int read; 
         while ((read = is.read(bytes)) != -1) 
          sb.append(new String(bytes, 0, read)); 
        } 

        System.out.println(sb); 
       } 
       finally { 
        if (is != null) 
         is.close(); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}