1

Делаю передачи файлов Темы с ЯвыКлиент не распознает конец потока файла

Вот код Сервера

(fileWriter = new BufferedOutputStream(fileTransferSocket.getOutputStream())) 

     try { 
      BufferedInputStream fileReader = new BufferedInputStream(new FileInputStream(CLIENT_PATH + "/" + filename)); 

      int packet; 

      while((packet = fileReader.read()) != -1) 
       fileWriter.write(packet); 

      fileWriter.flush(); 
      fileReader.close(); 

      System.out.println(filename + " send complete"); 
     } 

И код клиента

(fileReader = new BufferedInputStream(fileTransferSocket.getInputStream())) 

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

       int packet; 

       while((packet = fileReader.read()) != -1) 
        fileWriter.write(packet); 

       System.out.println(filename + " receive complete."); 
       fileWriter.close(); 
      } 

Серверные отпечатки

System.out.println(filename + " send complete"); 

Это означает, что сервер отправляет каждый байт файла.

Однако клиент не печатает

System.out.println(filename + " receive complete."); 

Я проверил, сколько раз в то время как работает цикл (Проверен Both, сервер и клиент)

Оба в то время как петля бежит 685 раз

Я думаю, Цикл while клиента не распознает конец передачи файла.

Кто-нибудь знает проблему?

ответ

-1

Вы можете проверить печать -1 в вашем распоряжении, чтобы сообщить об окончании преобразования:

while((packet = fileReader.read()) != -1) 
      fileWriter.write(packet); 
fileWriter.write(-1); 
+0

Это тоже не работает ... Я не могу избежать цикла. –

+1

Это неправильно. Отправка -1 просто отправляет значение байта '0xFF'. -1 возвращается специально методом «чтения» входного потока, он не является частью самого потока. – Radiodef

+0

Кажется, что в базовом потоке ввода или вывода байт равен 0-255, поэтому в уровне преобразования данных вы не можете сказать клиенту, что это конец. В противном случае вы закроете сокет или используете логические данные приложения, замените конец, а не только -1 в клиенте. Это могут быть некоторые специальные символы. –

1

Чтобы отправить EOF в гнездо, закройте fileWriter на сервере.

while((packet = fileReader.read()) != -1) 
    fileWriter.write(packet); 

fileWriter.close(); // note 
fileReader.close(); 
Смежные вопросы