Question

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.

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 && (noOfPackets!=0))
        while((count = fis1.read(sendData)) != -1 )
        { 
            if(noOfPackets<=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();
        }
    }
}
Was it helpful?

Solution

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.

No. The problem is that the bytes from the first packet are still contained in the recData byte array. The subsequent read then overwrites the beginning of the byte array with the contents of the second packet, but the remainder of the array is still filled with the data from the first packet.

The underlying issue is that you are ignoring the actual number of bytes received. You should also be using a FileOutputStream, not a Writer. Try this:

class Server
{
    public static void main(String args[]) throws IOException
    {
        ...

        while(true)
        {
            DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
            serverSocket.receive(recPacket);
            System.out.println("\n Packet length: " + recPacket.getLength());
            out.write((recPacket.getData(), 0, recPacket.getLength());
            System.out.println("\nPacket" + ++i + " written to file\n");
            out.flush();
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top