0

CLIENT SENDING SIDE

        if((readerInput = bufferedReaderFromCMD.readLine()) != null ){

            if(readerInput.equals("-file")){
                System.out.println("Checking If condition..");
                String receiver,filename;
                printWriter.println(readerInput);
                System.out.println("Enter File name: ");

                if((filename = bufferedReaderFromCMD.readLine()) != null){  

                    File f = new File(filename);
                    FileInputStream fin = new FileInputStream(f);
                    DataInputStream din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));  

                    printWriter.println(filename);
                    System.out.println("Enter receiver name: ");
                    receiver = bufferedReaderFromCMD.readLine();
                    printWriter.println(receiver);


                    byte b[] = new byte [8192];
                    long sz = (int) f.length();

                    printWriter.println(Long.toString(sz));

                    System.out.println("Size: "+ sz);

                    int read;

                    while((read = fin.read(b)) > 0){
                        dout.write(b, 0, read); 
                        dout.flush();
                        System.out.println("sending...From Client buffer = "+ read);
                    }
                    System.out.println("sent...");

                    fin.close();


                }
            }

CLIENT RECEIVING SIDE

                String s,filename;
                if(s.equals("-file"))
                {
                    if((filename = bufferedReader.readLine()) != null)
                    {
                        File f = new File("recieved from "+filename);
                        long filesize = Long.parseLong(bufferedReader.readLine());
                        FileOutputStream fos = new FileOutputStream(f,true);
                        DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

                        System.out.println(filesize);

                        byte b[] = new byte [8192];
                        long bytesRead;

                        int file_check = 0;
                        long buffersize = b.length;
                        long file_left = filesize;

                        while(file_check == 0){                         

                            if(file_left < 8192){
                                buffersize = file_left;
                                file_check++;
                            }

                            bytesRead = din.read(b, 0,((int) buffersize));
                            fos.write(b,0,((int) bytesRead));
                            file_left = file_left -((int) bytesRead);
                            System.out.println ("Left = "+file_left + " | Buffersize = " + buffersize);
                        }


                        fos.close();
                        System.out.println("File received From client Reciever");
                    }
                }
                else
                {
                    System.out.println(s);
                }

Server SIDE

        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
        printWriter.println("You are now Connected to the Server");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        string message;


         while((message = bufferedReader.readLine()) != null )
        {
            System.out.println("Incoming Client Message From "+ message);

            if(message.equals("-file"))
            {       String filename;
                if((filename = bufferedReader.readLine()) != null)
                {   
                    if((reciever = bufferedReader.readLine()) != null)
                    {
                        long filesize = Long.parseLong(bufferedReader.readLine());
                        Socket rsocket = hm1.get(reciever);
                        PrintWriter rprintWriter = new PrintWriter(rsocket.getOutputStream(), true);
                        filename = "Server - " + filename;


                        File f = new File(filename);
                        FileOutputStream fos = new FileOutputStream(f,true);
                        DataInputStream _din = new DataInputStream(new BufferedInputStream(socket.getInputStream()));  

                        byte b[] = new byte [8192];
                        int read;
                        int file_check = 0;
                        long buffersize = b.length;
                        long file_left = filesize;

                        long bytesRead;

                        while(file_check == 0){                         

                            if(file_left < 8192){
                                buffersize = file_left;
                                file_check++;
                            }

                            bytesRead = _din.read(b, 0,((int) buffersize));
                            fos.write(b,0,((int) bytesRead));
                            file_left = file_left -((int) bytesRead);
                            System.out.println ("Left = "+file_left + " | Buffersize = " + buffersize);
                        }

                        // Arrays.fill(b, null);

                        System.out.println("recieved ");
                        fos.close();

                        File new_file = new File(filename);
                        FileInputStream fin = new FileInputStream(new_file);
                        DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(rsocket.getOutputStream())); 

                        long sz = (int) new_file.length();
                        //System.out.println("Size: "+ sz);

                        rprintWriter.println("-file");
                        rprintWriter.println(filename);
                        rprintWriter.println(Long.toString(sz));

                        while((read = fin.read(b)) > 0){
                            dout.write(b, 0, read); 
                            dout.flush();
                            System.out.println("sending...From Server BUFFER = "+ read);
                        }

                        System.out.println("sent...From Server");
                        fin.close();
                    }
                }
            }

My terminal out is as follows this on 3 different terminals

Client sending 
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 1976
        sent...
Server recieveing 
        Left = 92088 | Buffersize = 8192
        Left = 83896 | Buffersize = 8192
        Left = 75704 | Buffersize = 8192
        Left = 67512 | Buffersize = 8192
        Left = 59320 | Buffersize = 8192
        Left = 51128 | Buffersize = 8192
        Left = 42936 | Buffersize = 8192
        Left = 34744 | Buffersize = 8192
        Left = 26552 | Buffersize = 8192
        Left = 18360 | Buffersize = 8192
        Left = 10168 | Buffersize = 8192
        Left = 1976 | Buffersize = 8192
        Left = 0 | Buffersize = 1976
        recieved 
Server Sending
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 8192
        sending...From Server BUFFER = 1976
        sent...From Server
Client recieveing
        Left = 92088 | Buffersize = 8192
        Left = 83896 | Buffersize = 8192
        Left = 75704 | Buffersize = 8192
        Left = 67512 | Buffersize = 8192
        Left = 59320 | Buffersize = 8192
        Left = 51128 | Buffersize = 8192
        Left = 42936 | Buffersize = 8192
        Left = 34744 | Buffersize = 8192
        Left = 26552 | Buffersize = 8192
        Left = 18360 | Buffersize = 8192
        Left = 16359 | Buffersize = 8192

I am implementing a normal client server model in Java. The idea is where a client can send file to other clients. It works in the following way.

1-Client sends file to the Server

2-Server receives the file and make it's own version

3-Server send the file to the client

I am using DataOutputStream and DataInputStream. I know it not possible to loose a packet but i do not know why but sometimes my client receiving side losses some packets.

My code works in the following way.

1- First i send file size to the server.

2- Server receives the file in chunks.

3- It minuses the chunk size for file size to know when file has been received.

My problem does not always happen but sometimes it does and the receiving side is left in the loop as it has not received those packets. Surprisingly the server sides always gets the file and also sends it but somehow the client side misses some packets.

I have been stuck on this problem for over 4 days any help would appreciated.

drainzerrr
  • 41
  • 1
  • 2
  • 10
  • Usual problem. Combination of buffered and unbuffered input and output at both ends. This cannot work. See my answer in the duplicate. – user207421 Mar 29 '18 at 06:07
  • After reading your answer multiple times. I still cannot understand your point. if you referring to these lines DataInputStream _din = new DataInputStream(socket.getInputStream()); DataOutputStream dout = new DataOutputStream(rsocket.getOutputStream()); Then i have also tested my code by applying it like this DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(rsocket.getOutputStream())); Sadly it still gets stuck sometimes – drainzerrr Mar 29 '18 at 12:14
  • I refer to `BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));` plus `DataInputStream _din = new DataInputStream(new BufferedInputStream(socket.getInputStream())); `. The `BufferedReader` will fill its buffer with whatever is available, which includes part of the following file data, thus stealing data from the `DataInputStream`. My answer in the duplicate uses the same set of streams for everything and so cannot have this problem. – user207421 Mar 30 '18 at 04:08
  • Bro i Don't know who you are I don't know where u are but U are my savior Infinite thanks!!!!!!!!!!!!!!!!!!!! – drainzerrr Mar 30 '18 at 13:20

1 Answers1

0

Possibly your bug is:

file_left = file_left - buffersize;

It should be:

file_left = file_left - (int)bytesRead;

The read is not guaranteed to fill the entire buffer.

ewramner
  • 5,810
  • 2
  • 17
  • 33