Программирование FTP AS3 и классы Socket и ByteArray - PullRequest
3 голосов
/ 15 сентября 2008

Извините за сюжетную линию, звучащую как еще более нудный титул Гарри Поттера.

Я пытаюсь использовать класс Socket AS3 для написания простой программы FTP для экспорта в качестве приложения AIR в Flex Builder 3. Я использую FTP-сервер в своей локальной сети для тестирования программы. Я могу успешно подключиться к серверу (самая простая часть), но я не могу отправлять какие-либо команды. Я почти уверен, что вы должны использовать класс ByteArray для отправки этих команд, но есть некоторая важная информация, которую я, по-видимому, упускаю. Кто-нибудь знает как это сделать? Спасибо! Dave

Ответы [ 8 ]

3 голосов
/ 13 января 2009

Протокол FTP предшествует кодированию UTF. Переключитесь на ANSI / ASCII для лучших результатов. Если вы выберете writeMultiByte вместо writeUTFBytes, учтите, что в linux он содержит ошибки. Вот в одну сторону.

Есть еще один вопрос здесь , где конец строки оказывается виновником, поэтому убедитесь, что вы правильно поняли (как предложено выше).

Как уже говорилось ранее, если это выполняется из Интернета, для всех соединений с сокетами потребуется междоменная политика, но это НЕ файл, основанный на HTTP. Недавние изменения в правилах безопасности означают, что любое соединение на основе сокетов должно сначала получить междоменный домен с сервера политики, размещенного на порту 843 целевого хоста.

Цитата из Adobe:

SWF-файл больше не может устанавливать сокет-соединение с собственным доменом без файла политики сокетов. До версии 9,0,115,0 SWF-файлу разрешалось устанавливать сокет-соединения с портами 1024 или более в своем собственном домене без файла политики.

Файлы политики HTTP больше не могут использоваться для авторизации соединений с сокетами. До версии 9,0,115,0 файл политики HTTP, передаваемый из основного местоположения /crossdomain.xml на порт 80, мог использоваться для авторизации сокет-соединения с любым портом 1024 или выше на том же хосте.

По сути, это означает, что вы должны контролировать целевой FTP-хост и установить на нем дополнительное программное обеспечение, чтобы это работало.

1 голос
/ 10 ноября 2009

Мне удалось заставить FTP-клиент работать в браузере, но он глючит. Мне пришлось заставить слушателя, работающего на порте 843, отправлять на сервер файл политики, чтобы Flash мог подключаться и передавать данные. Затем мне пришлось выяснить, как на самом деле работает FTP:

Вы должны открыть 2 сокета: командный сокет и сокет данных. Командный сокет - это то место, куда вы отправляете команды USER, PASS, CWD и STOR. Сокет данных - это место, куда вы записываете свои данные ByteArray. Отправка команды PASV сообщит вам, к какому порту должен подключаться ваш сокет данных.

Там, где есть ошибки, есть и Mac, и Safari, и FF, когда я вызываю команду socket.close (), сокет сервера фактически закрывается. На Windoze это не так. Это огромная проблема, потому что событие Event.CLOSE не запускается, пока СЕРВЕР не закроет соединение. Это в liveocs.

Это то, где я нахожусь. Я понятия не имею, почему он будет работать безупречно на Mac, а затем будет полностью отключен в 3 разных браузерах на Windows. Единственное, что я могу придумать, это то, что либо в моей конфигурации Windows что-то мешает правильной связи с сервером, либо проигрыватель Window Flash вызывает проблему.

Есть мысли?

1 голос
/ 20 сентября 2009

Чтение эта ссылка тоже и, возможно, она может быть полезна эта тоже.

Первый - о файлах политики, а второй - пример клиента TELNET (поэтому здесь нет FTP).

0 голосов
/ 14 ноября 2008

Из того, что я собрал, вы должны отправлять каждую команду по одной и проверять ответ, прежде чем двигаться дальше. Вы должны получить что-то против ProgressEvent.SOCKET_DATA

Попробуйте только это и посмотрите, что вы получите в ответ.

socket.writeUTFBytes("USER "+user+"\n"); socket.flush();

Вы бы тогда прочитали ответ вот так.

var response:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
0 голосов
/ 22 октября 2008

Чтобы правильно установить соединение, вы должны предоставить файл политики CrossDomain со своего FTP-сервера.

0 голосов
/ 02 октября 2008

Стандарт FTP требует CRLF в конце команд. Попробуйте использовать "\ r \ n" вместо "\ n" в вашем примере.

0 голосов
/ 16 сентября 2008

Вы на 100% уверены, что синтаксис правильный? Я знаю, что с HTTP вам нужно будет включить дополнительный разрыв строки после запроса на его прохождение. Без этого вы ничего не получите обратно. Не уверен, как обстоят дела с FTP.

0 голосов
/ 15 сентября 2008

Нам понадобится больше информации, чтобы решить эту проблему. То, что вы здесь говорите, мне кажется правильным. Вы используете класс Socket для отправки данных, а не ByteArray.

Вы уверены, что данные не отправляются? Как вы получаете ответ? Может быть, это работает нормально, но вы просто не знаете об этом? Как я уже сказал, расскажите нам больше о том, что вы делаете ..

У Ли Бримелоу есть скринкаст на gotoAndLearn о написании клиента POP3. По сути, это то же самое, что вы делаете, поэтому посмотрите.

...