2012-05-12 5 views
0

Я пытаюсь передать файл через сокет в java..активно, я смог передать ... но есть одна проблема. Проблема заключается в том, что файл отправлен с уменьшением размера. например я передать файл 300MB, клиент получит только 299mb .... мне было интересно, что может быть проблема ..Передача файла через сокет в Java

стороне сервера

File myFile = new File (basePath+"\\"+input.readUTF()); 
byte [] mybytearray = new byte [1024]; 
FileInputStream fis = new FileInputStream(myFile); 
BufferedInputStream bis = new BufferedInputStream(fis); 
txtArea.append("Sending... \n"); 
while (true) 
{ 
    int i = bis.read(mybytearray, 0, mybytearray.length); 
      if (i == -1) { 
     break; 
    } 
    output.write(mybytearray, 0, i); 
    txtArea.append("Sending chunk " + i + "\n"); 

} 
output.flush(); 

Client Side

output.writeUTF("get"); 
txtArea.append("Starting to recive file... \n"); 
       long start = System.currentTimeMillis(); 
       byte [] mybytearray = new byte [1024]; 
       txtArea.append("Connecting... \n"); 
       output.writeUTF(remoteSelection); 
       FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       int bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       while(bytesRead != -1) 
       { 
        bos.write(mybytearray, 0, bytesRead); 
        txtArea.append("got chunk" + bytesRead +"\n"); 
        bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       } 
bos.flush(); 
+5

Вам необходимо проверить -1 перед записью, а не после нее. Вы также злоупотребляете доступным() таким образом, который специально предупреждается в Javadoc; вы предполагаете, что размер файла вписывается в int; и т. д. и т. д. и т. д. и т. д. – EJP

+0

Добавьте к тому, что указали EJP, вы также проверяете доступность в BufferedInputStream, я думаю, он возвращает максимум длины буфера основного потока. – dragon66

+0

так как я могу проверить размер файла? Я пытаюсь использовать byte [] mybytearray = new byte [(int) myFile.length()]; прежде чем ... но он возвратит ошибку .. это из кучи, когда я пытаюсь отправить большой файл .. например, 600mb .. –

ответ

2

в канонический способ копирования потока в Java:

int count; 
byte[] buffer = new byte[8192]; // or whatever you like really, not too small 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Работы для ввода любой длины; не загружает весь вход в память; при этом не добавляет латентности.

Если вы отправляете более одного файла, вам необходимо сначала отправить длину, через DataOutputStream.writeLong(); прочитайте его на другом конце через обратную функцию; и отрегулируйте условие цикла на конце считывания, чтобы закончить после чтения точно столько же байтов. Не так просто, как может показаться; оставил упражнение для читателя.

+0

Как проверить длину файла? –

+0

@BobyHartanto Err, 'File.length()?' – EJP

+0

спасибо за помощь –

Смежные вопросы