2012-06-11 4 views
0

Je veux que mon serveur obtienne le nom du fichier qui lui sera envoyé et après avoir obtenu ce fichier, il pourrait l'enregistrer dans un nouvel emplacement avec le bon nom.Envoyer le nom du fichier puis le fichier lui-même

Voici le code du serveur:

class TheServer { 

    public void setUp() throws IOException { // this method is called from Main class. 
     ServerSocket serverSocket = new ServerSocket(1991); 
     System.out.println("Server setup and listening..."); 
     Socket connection = serverSocket.accept(); 
     System.out.println("Client connect"); 
     System.out.println("Socket is closed = " + serverSocket.isClosed()); 



     BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String str = rd.readLine(); 
     System.out.println("Recieved: " + str); 
     rd.close(); 



     InputStream is = connection.getInputStream(); 

     int bufferSize = connection.getReceiveBufferSize(); 

     FileOutputStream fos = new FileOutputStream("C:/" + str); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 


     byte[] bytes = new byte[bufferSize]; 

     int count; 

     while ((count = is.read(bytes)) > 0) { 
      bos.write(bytes, 0, count); 
     } 

     bos.flush(); 
     bos.close(); 
     is.close(); 
     connection.close(); 
     serverSocket.close(); 


    } 
} 

et voici le code client:

public class TheClient { 

    public void send(File file) throws UnknownHostException, IOException { // this method is called from Main class. 
     Socket socket = null; 
     String host = "127.0.0.1"; 

     socket = new Socket(host, 1991); 

     // Get the size of the file 
     long length = file.length(); 
     if (length > Integer.MAX_VALUE) { 
      System.out.println("File is too large."); 
     } 

     BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     wr.write(file.getName()); 
     wr.flush(); 

     byte[] bytes = new byte[(int) length]; 
     FileInputStream fis = new FileInputStream(file); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 

     int count; 

     while ((count = bis.read(bytes)) > 0) { 
      out.write(bytes, 0, count); 
     } 


     out.flush(); 
     out.close(); 
     fis.close(); 
     bis.close(); 
     socket.close(); 
    } 
} 

J'ai fait quelques tests de mon propre et il semble que mon client envoie le nom du classer à droite, mais en quelque sorte le serveur se trompe. Par exemple si mon client dit que le nom du fichier est "test.txt" mon serveur l'obtient par exemple comme "test.txt" -------------------- " ou "test.txtPK". Je n'arrive pas à comprendre pourquoi il ne reçoit pas le nom normalement. Quelqu'un sait pourquoi cela arrive? Ou y a-t-il un moyen plus facile de le faire? Et ma deuxième question est, comment puis-je l'utiliser non seulement dans localhost mais partout? J'ai essayé de changer mon hôte à mon adresse IP, mais cela n'a pas fonctionné. Merci.

Répondre

3

Vous n'envoyez jamais de fin de ligne après le nom du fichier. Par conséquent, lorsque le serveur lit readLine(), il lit tous les caractères jusqu'à ce qu'il trouve la première fin de ligne qui peut être quelque part dans le contenu du fichier. Parfois c'est après '-----' et parfois après 'PK'.

+0

Pourriez-vous me montrer comment faire? –

+0

Appelez juste 'wr.newLine()' après 'wr.write (file.getName())'. Moi, j'utiliserais probablement une bibliothèque comme Apache Commons IO. Il a beaucoup d'utilités utiles au-dessus des classes 'java.io'. –

+0

Ça a bien marché! Merci –

Questions connexes