Не удается получить FTP-сервер проекта класса для отправки 226 - PullRequest
1 голос
/ 24 апреля 2011

Для проекта класса я пишу FTP-клиент на Java (внешние библиотеки FTP не допускаются), который может подключаться и получать файлы со школьного FTP-сервера. По какой-то причине после завершения передачи сервер не отправит 226 и не закроет соединение со своего собственного конца.

Единственный способ заставить сервер отправлять 226 - это вручную закрыть InputStream со стороны клиента, что кажется небезопасным в том случае, если клиент не может быть на 100% уверен, когда файл завершил передачу. (В настоящее время метод InputStream available () используется для проверки того, как далеко проходит передача.)

В спецификации проекта говорится, что мы должны следовать требованиям RFC, где это применимо для подмножества команд, которые мы реализуем. RFC заявляет это:

Как правило, ответственность за обслуживание данных лежит на сервере. соединение - инициировать и закрыть. Исключение из этого когда пользователь-DTP отправляет данные в режиме передачи, который требует, чтобы соединение было закрыто, чтобы указать EOF. Сервер ДОЛЖЕН закрыть соединение для передачи данных при следующих условиях: 1. Сервер завершил отправку данных в режиме передачи это требует закрытия, чтобы указать EOF. 2. Сервер получает команду ABORT от пользователя. 3. Спецификация порта изменяется командой из пользователь. 4. Контрольное соединение закрыто легально или иным образом. 5. Возникает неисправимая ошибка. В противном случае закрытие является серверной опцией, осуществление которой сервер должен указать пользовательскому процессу либо 250, либо 226 только ответ.

Есть ли что-то, что я здесь упускаю?

РЕДАКТИРОВАТЬ: Сервер работает ProFTPD 1.3.0a Server.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2011

Какой режим передачи вы используете?Цитата из 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)");
    }
0 голосов
/ 24 апреля 2011

Анон,

Этот пост всего лишь мое личное мнение.

Я был вашим университетским лектором, и я был бы рад, если бы вы просто закрыли явно взволнованный поток на стороне клиента, а затем обработали последующие 226 ... КАК ДОКЛАДЫВАЕТСЯ, ПОЧЕМУ ВЫ ЭТО СДЕЛАЛИ, особенно отмечая, что это «обходной путь» для очевидного отклонения от опубликованного протокола школьной службой FTP. I.e: "Не моя проблема, я просто должен разобраться с этим. K Boss?"

Для оценки тройного бонуса: 1. Создайте код своего клиента для работы как со стандартным сервером (на вашем компьютере будет запущен FTP-сервер для тестирования, есть бесплатные для каждого O / S), так и с «явно изворотливым» FTP-сервером вашей школы ... и 2. Узнайте точно, что такое школьный FTP-сервер (10 долларов говорят, что это какой-то доморощенный профессионал с супер-нестандартными экстремумами), а затем посмотрите, можете ли вы подтвердить, что это связано с известной проблемой этой реализации ... и если это не так, подайте отчет об ошибке автору (-ам).

Я просто предполагаю, что это "поворот хвоста" профа ... чтобы увидеть, кто готов к "вызову реального мира".

Приветствия. Кит.

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