为什么文件在Java套接字的客户端损坏?

时间:2011-06-01 05:49:48

标签: java sockets

我编写了一个java代码,它使用.exeFileInputStream从服务器向客户端发送BufferedInputStream文件,但文件在客户端损坏。

可能是什么原因?

command1= ServerFrame.msg1+".exe";
File p=new File(command1);
FileInputStream 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();      

3 个答案:

答案 0 :(得分:2)

我认为s是你的套接字。您的代码中很少有东西可以使用:

  • bis.available()返回没有bocking可以读取的字节数,而不是文件的总大小,你应该使用循环来读取文件
  • 您在两个不同的缓冲区中使用输出流,并且无需刷新即可写入两个缓冲区;另外,你为什么要写UTF?

以下是您打算做的事情:

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();

答案 1 :(得分:0)

bis.available()返回可用于读取的字节,它可能不是完整的内容大小,你必须在循环中读取它直到达到EOF。

答案 2 :(得分:0)

如果有人遇到同样的问题,缓冲区大小是这种情况的罪魁祸首:

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

它应该是较小的尝试1024或其他:

byte b[]=new byte[1024];

希望这会有所帮助..