title: UDP Client Server File Transfer
body: <p>I am trying to send packets from client to server via UDP. The problem I am facing is that if the last packet size is less than the size of the byte array in which we are reading, then redundant data from previous packet is being appended to it. I tried copying only the correct part of the last packet into a new byte array and then send it but the client somehow sends the wrong packet only. Please can anyone point out what I am doing wrong. Thanks in advance. </p>
  
  <pre><code>Client.java:
  
  class client
  {
  static int serverPort;
  static String filename;
      public static void main(String args[]) throws SocketException, IOException
      {
          int count=0;
          int MAX_SIZE = 1048;
  
          DatagramSocket clientSocket = new DatagramSocket();
          InetAddress IpAddress = InetAddress.getByName("localhost");
  
          byte[] sendData = new byte[MAX_SIZE];
  
          String filePath = "C:\\in.txt";
          File file = new File(filePath);
          FileInputStream fis = new FileInputStream(file);
  
  
          int totLength = 0; 
  
          while((count = fis.read(sendData)) != -1)    //calculate total length of file
          {
              totLength += count;
          }
  
          System.out.println("Total Length :" + totLength);
  
          int noOfPackets = totLength/MAX_SIZE;
          System.out.println("No of packets : " + noOfPackets);
  
          int off = noOfPackets * MAX_SIZE;  //calculate offset. it total length of file is 1048 and array size is 1000 den starting position of last packet is 1001. this value is stored in off.
  
          int lastPackLen = totLength - off;
          System.out.println("\nLast packet Length : " + lastPackLen);
  
          byte[] lastPack = new byte[lastPackLen-1];  //create new array without redundant information
  
  
          fis.close();
  
          FileInputStream fis1 = new FileInputStream(file);
          //while((count = fis1.read(sendData)) != -1 &amp;&amp; (noOfPackets!=0))
          while((count = fis1.read(sendData)) != -1 )
          { 
              if(noOfPackets&lt;=0)
                  break;
              System.out.println(new String(sendData));
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IpAddress, 9876);
              clientSocket.send(sendPacket);
              System.out.println("========");
              System.out.println("last pack sent" + sendPacket);
          noOfPackets--;
          }
  
          //check
          System.out.println("\nlast packet\n");
          System.out.println(new String(sendData));
  
          lastPack = Arrays.copyOf(sendData, lastPackLen);
  
          System.out.println("\nActual last packet\n");
          System.out.println(new String(lastPack));
                  //send the correct packet now. but this packet is not being send. 
          DatagramPacket sendPacket1 = new DatagramPacket(lastPack, lastPack.length, IpAddress,     9876);
          clientSocket.send(sendPacket1);
          System.out.println("last pack sent" + sendPacket1);
  
      }
  }
  
  Server.java:
  import java.io.*;
  import java.net.*;
  
  class server
  {
      public static void main(String args[]) throws IOException
      {
          DatagramSocket serverSocket = new DatagramSocket(9876);
          byte[] recData = new byte[1024];
          int i =0;
  
          FileWriter file = new FileWriter("C:\\Users\\ayushi\\Documents\\Semester 2\\Misc\\setups\\eclipse\\ip_1\\ip_second\\src\\out.txt");
          PrintWriter out = new PrintWriter(file);
  
  
          //BufferedOutputStream bos = new BufferedOutputStream(fos);
  
          while(true)
          {
              //PrintWriter out = new PrintWriter(file);
  
              DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
              serverSocket.receive(recPacket);
              String line = new String(recPacket.getData());
              System.out.println("\n Data: " + line);
              out.println(line);
              System.out.println("\nPacket" + ++i + " written to file\n");
              out.flush();
          }
      }
  }
  </code></pre>