0

Я использую сокетов для передачи файлов в Java. Вот Клиент кодява файл получить остановки

for(int i = 0;i < fileList.size();i++) { 
    String filename = (String)fileList.get(i); 
    RequestFile(filename); 

    try { 
     BufferedOutputStream fileWriter = new BufferedOutputStream(
               new FileOutputStream(
                new File(PROGRAM_PATH + "/" + 
                  filename)));   
     int packet; 
     int count = 0; 

     while((packet = fileReader.read()) != -1) { 
      fileWriter.write(packet); 
      count++; 
     } 

     System.out.println(filename + " receiver complete. (count : " + count + ")"); 
     fileWriter.flush(); 
     fileWriter.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

А вот SERVER код

public void SendFile(String filename) { 
    try { 
     fileReader = new BufferedInputStream(new FileInputStream(CLIENT_PATH + "/" + filename)); 

     int packet; 
     int count = 0; 
     while((packet = fileReader.read()) != -1) { 
      count++; 
      fileWriter.write(packet); 
     } 
     fileWriter.write(-1); 
     System.out.println(count); 

     fileReader.close(); 
    } 
    catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

Когда я проверил Подсчитайте сервера, он был 635. Это означает, что сервер отправил данные 635 раз. Однако, номер печати клиента только 512. (От 0 до 511), я думаю, что остановился на read(), потому что

System.out.println(filename + " receiver complete. (count : " + count + ")"); 

не печатается. Может ли кто-нибудь сказать мне причину и решение?

+0

Я думаю, вы должны использовать 'пакет' для увеличения' count' и проверить, все ли передаются байты или нет. – Tirath

ответ

0

На стороне сервера вы не можете отправить байт со значением -1 клиенту. Эта строка:

fileWriter.write(-1); 

Это не делает то, что вы хотите. Метод write() примет самые младшие 8 бит параметра и отправит его как один байт (который в этом случае будет 0xff). На стороне клиента fileReader.read() получит это как 0xff (типа int), а не как -1 (типа int).

-1 - специальное значение, указывающее, что конец потока достигнут. Это не допустимые данные для записи или чтения. Если вы отправляете -1, клиент будет читать это как 0xff=255. Значения, которые могут быть отправлены и получены, равны 0..255 включительно. Опять же, -1 - особое значение для конца потока.

На стороне сервера вы не закрываете и не закрываете выходной поток. Это может объяснить разницу (хранение данных в буфере может не дойти до клиента).

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

  • Нет связанных вопросов^_^