Обработка асинхронных ответов - PullRequest
0 голосов
/ 23 мая 2010

Я создаю FTP-клиент с нуля, и я заметил, что коды ответов не являются немедленными (что неудивительно).Что было бы хорошим подходом для получения соответствующего кода для команды?

Ниже приведен пример вывода сервера Filezilla.Код ответа - это три цифры в конце каждой строки.

(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> Connected, sending welcome message...
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.12 beta
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220-written by Tim Kosse (Tim.Kosse@gmx.de)
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220 Please visit http://sourceforge.net/projects/filezilla/
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> user anonymous
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 331 Password required for anonymous

1 Ответ

1 голос
/ 23 мая 2010

В этом конкретном случае я бы не стал реализовывать это асинхронно. Если задержка между отправкой команды и получением кода ответа не велика (что, вероятно, не для FTP), и вы можете безопасно выполнить другую команду, не зная результата последней (что, вероятно, не можете), это действительно стоит попытаться реализовать это асинхронно.

Я бы заблокировал выполнение между отправкой командной строки и получением полного ответа, т. Е. В псевдокоде у вас может быть метод execute, такой как:

  1. Отправить командную строку по сети
  2. Дождитесь возвращения символа (или тайм-аута, если вы хотите это сделать), используя метод чтения блокирующей сети или неблокирующий метод + Thread.sleep (..)
  3. Проверьте, является ли символ токеном «конец ответа» (новая строка?)
  4. Если нет, вернитесь к 2, если это так, верните полную строку ответа

Если вы действительно полны решимости пойти по асинхронному маршруту, вам следует взглянуть на шаблон обратного вызова .

Надеюсь, это поможет.

...