Kaj
Kaj

Reputation: 814

Missing one byte when transferring an image over Socket Java

I have a problem transferring a file over socket. I Wrote a simple client / server app and the client takes a screenshot and send it to server. The problem is the file is not completed whatever i do, It's always missing the first byte from the array which makes the photo damaged. When I open the photo in any hex editor and compare the original photo with the one that the client sent, I can see the missing byte, as if I add it, the photo opens without the problem. The size of the sent file missing just one byte ! Here is a photo for the problem :

Original photo

Original photo

sent photo sent photo

Here is the code :

Server ( Receiver ) :

byte[] buf;
InputStream inp;
try (BufferedOutputStream out1 = new BufferedOutputStream(new FileOutputStream(new File("final.jpeg")))) {
    buf = new byte[s.getReceiveBufferSize()];
    inp = new DataInputStream(s.getInputStream());
    Thread.sleep(200);
    int len = 0;
    while ((len = inp.read(buf)) >0){
    out1.write(buf,0,len);
    }
    out1.flush();
     inp.close();
     out1.close();
}

Client ( Sender ):

BufferedImage screenshot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(screenshot, "jpeg", os);
ImageIO.write(screenshot, "jpeg", new File("test.jpeg"));
OutputStream out = new BufferedOutputStream( connection.getOutputStream());
out.write(os.toByteArray());
out.close();

I have tried to send the array with the same way I receive it but no lock. I have tried with, and without buffered, I have tried flush in both sides, I tried to turn off Nod antivirus, Tried a sleep when sending length, I almost tried everything without success . I have tried on both, My pc and a virtual machine windows 7 ! Any help will be appreciated.

Edit : First 10 bytes from the original file : Original

first 10 bytes from the sent file : enter image description here

Upvotes: 0

Views: 1301

Answers (4)

user207421
user207421

Reputation: 310850

The code you posted does not lose data. Somewhere prior to executing the server code you posted, you have executed a single InputStream.read() of one byte, possibly in a misguided attempt to test for end of stream.

The sleep is just literally a waste of time. Remove it. You don't need the DataInput/OutputStreams either.

Upvotes: 1

Kaj
Kaj

Reputation: 814

Ok it was my fault ! I was looking for something wrong in server side but the fault was in client side ! I opened a DataInputStream to read the order coming from server without closing it and that was the problem.

Upvotes: 0

Mick
Mick

Reputation: 973

The client code looks fine. Must be the server. You only posted the part when "some" input stream is written to a file. What happens before? Anyone doing a read() on the input stream?

Sorry for writing this in the "answer" section. Apparently, I cannot comment yet.

Upvotes: 0

diginoise
diginoise

Reputation: 7620

Please keep in mind that DataInputStream signals end of stream by returning value -1 from read() therefore your server reading loop should look like this:

while ((len = inp.read(buf)) != -1){
    out1.write(buf,0,len);
}

Perhaps this helps.

Upvotes: 1

Related Questions