title: Socket file transfer
body: <p>In this <a href="http://www.adp-gmbh.ch/blog/2004/november/15.html" rel="nofollow">code</a> if the files are sent at the first time(no matter the number files i'm sending.) the code works fine. But when I put the FileSender in a loop to send files one by one, after the first transfer, the data received on the receiver's end is arbitrary(if checked during debugging) and it wouldn't even receive the files. Here's the change which I've done and it's not working.</p>
  
  <p><strong>FileSender.java</strong></p>
  
  <pre><code>import java.io.OutputStream;
  import java.io.File;
  import java.net.Socket;
  public class FileSender {
  public  void main(Socket socket,String[] args) {
  try {
  
    OutputStream os     = socket.getOutputStream();
    int cnt_files = args.length;
  
    // How many files?
    ByteStream.toStream(os, cnt_files);
  
    for (int cur_file=0; cur_file&lt;cnt_files; cur_file++) {
      ByteStream.toStream(os, new File(args[cur_file]).getName());
      ByteStream.toStream(os, new File(args[cur_file]));
    }
  }
  catch (Exception ex) {
    ex.printStackTrace();
  }
  }
  }
  </code></pre>
  
  <p>String[] args  contains the path of the files to be transmitted.</p>
  
  <p><strong>FileReceiver.java</strong></p>
  
  <pre><code>import java.io.File;
  import java.io.InputStream;
  import java.net.Socket;
  
  public class FileReceiver {
  
  public void main(Socket socket,String arg) {
  try {
      InputStream in = socket.getInputStream();
  
    int nof_files = ByteStream.toInt(in);
  System.out.println("reach 1     "+ nof_files);
    for (int cur_file=0;cur_file &lt; nof_files; cur_file++) {
      String file_name = ByteStream.toString(in);
  
      File file=new File(arg+file_name);
      System.out.println("Received path is :  "+file);
      ByteStream.toFile(in, file);
    }
  
  }
  catch (java.lang.Exception ex) {
    ex.printStackTrace(System.out);
  }
  }
  
  }
  </code></pre>
  
  <p>arg contains the path at which the files is to be stored.</p>
  
  <p>I want that i call the <strong>main</strong> functions mentioned whenever i want to transfer the file. Basically i want to transfer multiple files which can contain directories as well. to do this I've written the following code.</p>
  
  <p><strong>ServerFile.java</strong></p>
  
  <pre><code>import java.io.*;
  import java.net.*;
  public class ClientFile implements Runnable{
  Socket clientsocket;
  public void run() {
      try
      {
          clientsocket = new Socket("219.64.189.14",6789);
      // Some code
      copy(outtoserver,infromserver, files);      // files contains the path of files to be transferred.
      // Some code
          clientsocket.close();
      }
      catch(Exception e2)
      {
              System.out.println("ClientFile   "+String.valueOf(e2) + "\n");
      }
  }
  public void copy(DataOutputStream outtoserver,BufferedReader infromserver,String[] files)
  {
      try
      {
          FileSender fs = new FileSender();
          int totalfiles=0;
          int r=0;
          File oldfile;
          outtoserver.write(files.length);
          String chk;
          while(totalfiles&lt;files.length)
          {
  
              oldfile = new File(files[totalfiles]);
              if(oldfile.isDirectory())
              {
                  outtoserver.writeBytes("folder\n");
                  File folder1[] = oldfile.listFiles();
                  String[] folder = new String[folder1.length];
                  int count=0;
                  for(File name : folder1)
                  {
                      folder[count] = name + "";
                      System.out.println(folder[count]);
                      count++;
                  }
                  outtoserver.writeBytes(oldfile.getName()+"\n");
                  fs.main(clientsocket, folder);
  
              }
              else if(oldfile.isFile())
              {
                  outtoserver.writeBytes("file\n");
          chk = infromserver.readLine();
                  if(chk.equals("send"))
                  {
                      outtoserver.writeBytes(oldfile.getName()+"\n");
                      String[] folder = new String[]{oldfile.getAbsolutePath()};
                      fs.main(clientsocket, folder);
                  }
                  totalfiles++;
                  outtoserver.flush();
  
              }
          }
      }
      catch(Exception e)
      {
          System.out.println("ClientFile --&gt;&gt;  "+e.toString());
      }
  }
  }
  </code></pre>
  
  <p><strong>ClientFile.java</strong></p>
  
  <pre><code>import java.io.*;
  import java.net.*;
  import javax.swing.*;
  class ServerFile implements Runnable {
  Socket conn;
  public ServerFile(Socket a)
  {
      conn = a;
  }
  public void run() {
      File file1;
      String clientsen="";
      try
      {  // Some code
         copy(outtoclient,infromclient,file1.getAbsolutePath());      //file1 is the directory to which the file has to stored.    
     // some code
      }      
      catch(Exception e0)
      {
           System.out.println("ServerFile   "+String.valueOf(e0)+"\n"+e0.getCause());
      }
  }//end main
  public void copy(DataOutputStream outtoclient,BufferedReader infromclient,String basepath)
  {
      try
      {
           FileReceiver fr = new FileReceiver();
           int totfiles = infromclient.read();
           int tot=0;
           File file;
           String path = null,chk;
           while(tot&lt;totfiles)
           {
               chk = infromclient.readLine();
               if(chk.equals("file"))
               {
                  outtoclient.writeBytes("send\n");
                  path = infromclient.readLine();
                  path = basepath+File.separator+path;
                  file=new File(path);
                  fr.main(conn, basepath+File.separator);
               }
               else if(chk.equals("folder"))
               {
                   String name = infromclient.readLine();
                   name = basepath+File.separator+name;
                   new File(name).mkdir();
                   fr.main(conn, name+File.separator);
               }
               tot++;
           }
      }
      catch(Exception e)
      {
          System.out.println("Server file:    "+e.toString());
      }
  }
  
  }//end class
  </code></pre>
  
  <p>Correct me by all means if I'm wrong.</p>
  
  <p>Any help appreciated.</p>