title: Large file transfer with sockets
body: <p>When I'm transferring a large file using socket programming, the received file is incomplete i.e. it is an mp3 file which when i play sounds weird.
  The code is:</p>
  
  <p><strong>Server side:</strong></p>
  
  <pre><code>File myFile = new File("abc.mp3");
  {
      Socket sock = servsock.accept();
      int packetsize=1024;
      double nosofpackets=Math.ceil(((int) myFile.length())/packetsize);
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
      for(double i=0;i&lt;nosofpackets+1;i++) {
          byte[] mybytearray = new byte[packetsize];
          bis.read(mybytearray, 0, mybytearray.length);
          System.out.println("Packet:"+(i+1));
          OutputStream os = sock.getOutputStream();
          os.write(mybytearray, 0,mybytearray.length);
          os.flush();
      }
  }
  </code></pre>
  
  <p><strong>Client side:</strong></p>
  
  <pre><code>int packetsize=1024;
  FileOutputStream fos = new FileOutputStream("zz.mp3");
  BufferedOutputStream bos = new BufferedOutputStream(fos);
  double nosofpackets=Math.ceil(((int) (new File("abc.mp3")).length())/packetsize);
  for(double i=0;i&lt;nosofpackets+1;i++)
  {
      InputStream is = sock.getInputStream();
      byte[] mybytearray = new byte[packetsize];
      int bytesRead = is.read(mybytearray, 0,mybytearray.length );
      System.out.println("Packet:"+(i+1));
      bos.write(mybytearray, 0,mybytearray.length);
  }
  sock.close();
  bos.close();
  </code></pre>
  
  <p>On the Client side I have used <code>new File("abc.mp3")).length</code> just for simplicity (I could send the length of the file from the server side).</p>
  
  <p>This code works perfectly if client and server are the same machine, but the file gets distorted if they are on different machines.</p>