Какой режим передачи вы используете?Цитата из RFC959:
Режим потоковой передачи по своей природе ненадежен, поскольку невозможно определить, преждевременно закрыто соединение или нет.Другие режимы передачи (Блок, Сжатый) не закрывают соединение, чтобы указать конец файла.У них достаточно FTP-кодировки, чтобы соединение для передачи данных можно было проанализировать, чтобы определить конец файла.Таким образом, используя эти режимы, можно оставить соединение для передачи данных открытым для нескольких передач файлов.
Используете ли вы блокировку или сжатие?
РЕДАКТИРОВАТЬ - Oh - stream
Iне принимал его при первом чтении, но вы говорите, что используете InputStream.available()
, чтобы увидеть, как далеко проходит передача?Это не то, что делает этот метод.В этом случае он возвращает количество байтов, которые были получены компьютером, но еще не обработаны приложением.Возвращаемое значение может быть от нуля до полного размера файла.
Если вы предполагаете, что файл полностью отправлен, когда available()
возвращает 0, вы прекращаете чтение слишком рано - вот почему серверне закрывает сокет и не отправляет 226.
Единственный способ определить, полностью ли файл отправлен, - это проверить возврат из операции read
из потока.Если это -1, файл завершен.Чтение в байтовый массив может считывать ноль байтов.Это необычно, но разрешено.Типичный код для чтения из входного потока до тех пор, пока вход не будет закрыт, будет выглядеть следующим образом:
byte[] buffer = new byte[0x1000];
int read;
while( (read=in.read(buffer)) != -1 ) {
System.out.println("Read "+read +" bytes from socket ("+
in.available()+" available now)");
}