2008-09-15 7 views
3

Извините за предметную строку, звучащую как ровный титул Гарри Поттера.AS3 Программирование на FTP и классы Socket и ByteArray

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

ответ

0

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

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

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

0

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

0

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

0

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

0

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

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

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

Вы бы затем прочли ответ так.

var response:String = mySocket.readUTFBytes(mySocket.bytesAvailable); 
3

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

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

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

Цитируя Adobe:

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

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

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

+0

Он мог пройти через своего хозяина, чтобы этого не случилось. –

+0

Я согласен, но никогда не был в состоянии взять на себя полосу пропускания, которую это повлекло бы – spender

1

Прочитано this link тоже, может быть, и полезно this one тоже.

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

1

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

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

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

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

Любые мысли?