2013-08-05 3 views
2

Je travaille actuellement avec Java Sockets. J'ai créé un code côté serveur et un code côté client pour transférer le fichier par socket. J'ai réussi à transférer les fichiers du client vers le serveur avec le même système, mais si j'ai essayé avec les différents systèmes sur une plate-forme différente, alors cela ne fonctionne pas. Les codes côté client et côté serveur sont donnés ci-dessous.Comment transférer un fichier en utilisant IOUtils.copy via Java Sockets

code côté serveur

public class FileTransferTestServer extends Thread{ 

    private final Socket socket; 

    public FileTransferTestServer(Socket socket) { 
     // TODO Auto-generated constructor stub 
     this.socket = socket; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     try { 
      ServerSocket serverSocket = new ServerSocket(5000); 
      Socket socket = serverSocket.accept(); 
      System.out.println("Connection Established with "+socket.getInetAddress().getHostAddress()); 
      new FileTransferTestServer(socket).start(); 
      serverSocket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void run(){ 
     try { 
      InputStream is = socket.getInputStream(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      String buffer = null; 
      String fileName = null; 

      if((buffer = br.readLine()) != null){ 
       fileName = buffer; 
      } 

      FileOutputStream fos = new FileOutputStream(fileName); 
      int res = IOUtils.copy(is, fos); 
      System.out.println("res : "+res); 
      is.close(); 
      fos.flush();fos.close(); 
      br.close(); 


     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

Code côté client

public class FileTransferClient { 

    public FileTransferClient() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     try { 
      Socket socket = new Socket("172.16.4.23",5000); 
      File file = new File("/Users/Guest/Desktop/DQM.txt"); 
      OutputStream outputStream = socket.getOutputStream(); 
      PrintWriter out = new PrintWriter(outputStream); 
      out.println("file-transfer"); 
      out.flush(); 
      out.println(""+file.getName()); 
      out.flush(); 
      FileInputStream fis = new FileInputStream(file); 
      int res = IOUtils.copy(fis, outputStream); 
      out.flush(); 
      outputStream.flush(); 
      outputStream.close(); 
      fis.close(); 
      System.out.println("res : "+res); 
      socket.close(); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

Comment faire de ce programme pour transférer des fichiers entre le système

J'ai essayé avec Windows (Server) & Mac OS X (Client) et Windows (Serveur) & LinuxMint (Client)

Remarque: 1. Je souhaite envoyer le nom de fichier suivi du contenu du fichier. 2. Le contenu du fichier peut être sous n'importe quelle forme (fichier texte ou binaire)

Répondre

2

Vous ne pouvez pas mélanger test et binaire dans le même flux sauf si vous savez vraiment ce que vous faites. Dans ce cas, BufferedReader suppose que vous utiliserez ce lecteur uniquement à partir de maintenant et qu'il peut lire autant de données que possible. Cela signifie qu'il peut lire les données que vous avez l'intention d'être pour le fichier.

Je vous suggère d'utiliser DataInput/OutputStream, et seulement cela. Vous pouvez utiliser writeUtf/readUTF pour le texte.

Pour écrire

Socket socket = new Socket("172.16.4.23",5000); 
String pathname = "/Users/Guest/Desktop/DQM.txt"; 
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
outputStream.writeUTF(pathname); 
FileInputStream fis = new FileInputStream(pathname); 
int res = IOUtils.copy(fis, dos); 
fis.close(); 
dos.close(); 
socket.close(); 

Pour lire

DataInputStream dis = new DataInputStream(socket.getInputStream()); 
String fileName = dis.readUTF(); 
FileOutputStream fos = new FileOutputStream(fileName); 
int res = IOUtils.copy(dis, fos); 
fos.close(); 
socket.close(); 
+0

Pouvez-vous donner un extrait de code s'il vous plaît. –

+0

@GowthamShanmugaraj J'ai mis à jour ma réponse. –

+0

Oui, ça marche :). Merci [Peter Lawrey] (http://stackoverflow.com/users/57695/peter-lawrey) –

Questions connexes