开发者

Why file gets corrupted on client side in java socket?

I have written a java code which sends a .exe file from the server to the client using FileInputStream and BufferedInputStream, but the file gets corrupted at the client side.

What could be the reason?

command1= ServerFrame.msg1+".exe";
File p=new File(command1);
Fil开发者_开发知识库eInputStream f=new FileInputStream(p);
BufferedInputStream bis=new BufferedInputStream(f);
Integer d=bis.available();
int d1=d;
byte b[]=new byte[d];
bis.read(b,0,d1);
System.out.println(d1);
dos=new DataOutputStream(s.getOutputStream());
BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
dos.writeUTF(d.toString());             // sending length in long
bos.write(b,0,d1);                      // sending the bytess

bos.flush();
bis.close();  
bos.close();
dos.close();      


I suppose that s is your socket. There are few thing that can be wong in your code:

  • bis.available() returns the number of bytes that can be read without bocking, not the total size of the file, you should use a loop to read the file
  • you use the output stream in two different buffers and you write to both of them without flushing; also, why are you writing UTF?

Here is what you intend to do:

private void copy(InputStream in, OutputStream out) {
    byte[] buf = new byte[0x1000];
    int r;
    while ((r = in.read(buf)) >= 0) {
        out.write(b, 0, r);
    }
}
InputStream in = new BufferedInputStream(new FileInputStream(path));
OutputStream out = new BufferedOutputStream(s.getOutputStream());
copy(in, out);
in.close();
out.close();


bis.available() returns the bytes available for read, it may not be the full content size, u have to read in a loop till it reaches EOF.


in case someone stuck with same problem, buffer size is the culprit in this case :

Integer d=bis.available(); 
byte b[]=new byte[d];

It should be lesser try 1024 or something:

byte b[]=new byte[1024];

hope this helps..

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜