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.