Почему файл поврежден на стороне клиента в сокете Java? - PullRequest
0 голосов
/ 01 июня 2011

Я написал код Java, который отправляет файл .exe с сервера на клиент, используя FileInputStream и 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 ]

2 голосов
/ 01 июня 2011

Полагаю, s - это ваша розетка. Есть несколько вещей, которые могут быть в вашем коде:

  • bis.available() возвращает количество байтов, которые могут быть прочитаны без блокировки, а не общий размер файла, вы должны использовать цикл для чтения файла
  • вы используете выходной поток в двух разных буферах и записываете в них оба без очистки; Кроме того, почему ты пишешь 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();
0 голосов
/ 31 марта 2017

В случае, если кто-то застрял с той же проблемой, размер буфера является виновником в этом случае:

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

Это должно быть меньше, попробуйте 1024 или что-то еще:

byte b[]=new byte[1024];

надеюсь, это поможет..

0 голосов
/ 01 июня 2011

bis.available () возвращает байты, доступные для чтения, это может быть не полный размер контента, вам нужно читать в цикле, пока он не достигнет EOF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...