3

件名がさらにオタクなハリー・ポッターのタイトルのように聞こえて申し訳ありません。

AS3 の Socket クラスを使用して、簡単な FTP プログラムを作成し、Flex Builder 3 で AIR アプリとしてエクスポートしようとしています。ローカル ネットワーク上の FTP サーバーを使用してプログラムをテストしています。サーバーに正常に接続できますが (簡単な部分)、コマンドを送信できません。これらのコマンドを送信するには ByteArray クラスを使用する必要があると確信していますが、明らかに欠けている重要な情報がいくつかあります。誰もこれを行う方法を知っていますか? ありがとう!デイブ

4

8 に答える 8

3

FTP プロトコルは、UTF エンコーディングよりも前から存在します。より良い結果を得るには、ANSI/ASCII に切り替えてください。writeUTFBytes の代わりに writeMultiByte を選択する場合、Linux ではバグがあることに注意してください。ここにそれを回避する1つの方法があります。

行末が原因であることが判明した別の質問がここにあります。そのため、(上記で提案したように) 正しいことを確認してください。

前に述べたように、これが Web から実行されている場合、すべてのソケット接続でクロスドメイン ポリシーが必要になりますが、これは HTTP を介したファイル ベースではありません。最近のセキュリティ ルールの変更により、ソケット ベースの接続では、最初にターゲット ホストのポート 843 でホストされているポリシー サーバーからクロスドメインを取得する必要があります。

アドビからの引用:

SWF ファイルは、ソケット ポリシー ファイルがないと、独自のドメインへのソケット接続を確立できなくなりました。バージョン 9,0,115,0 より前では、SWF ファイルは、ポリシー ファイルなしで、独自のドメイン内のポート 1024 以上にソケット接続を行うことが許可されていました。

HTTP ポリシー ファイルは、ソケット接続の承認に使用できなくなりました。バージョン 9,0,115,0 より前では、ポート 80 の /crossdomain.xml のマスター ロケーションから提供される HTTP ポリシー ファイルを使用して、同じホスト上の任意のポート 1024 以上へのソケット接続を承認できました。

基本的に、これが意味することは、ターゲット FTP ホストを制御し、これを機能させるために追加のソフトウェアをインストールする必要があるということです。

于 2009-01-13T01:17:11.897 に答える
1

ブラウザで FTP クライアントを動作させることはできましたが、バグがあります。Flash が接続してデータを転送できるように、ポート 843 で実行されているリスナーを取得してポリシー ファイルをサーバーに配置する必要がありました。次に、FTP が実際にどのように機能するかを理解する必要がありました。

コマンドソケットとデータソケットの 2 つのソケットを開く必要があります。コマンド ソケットは、USER、PASS、CWD、および STOR コマンドを送信する場所です。データ ソケットは、ByteArray データを書き込む場所です。PASV コマンドを送信すると、データ ソケットを接続する必要があるポートがわかります。

バグがあるのは Mac で、Safari と FF の両方で、「socket.close()」コマンドを呼び出すと、サーバー ソケットが実際に閉じます。Windoze では、そうではありません。SERVER が接続を閉じるまで Event.CLOSE イベントが発生しないため、これは大きな問題です。これはライブドキュメントにあります。

これが私がいるところです。Mac では問題なく動作するのに、Windows では 3 つの異なるブラウザーで完全に機能しない理由がわかりません。私が思いつくことができる唯一のことは、サーバーとの適切な通信を妨げているのは Windows 構成の何かであるか、問題を引き起こしているのは Window Flash プレーヤーであるということです。

何かご意見は?

于 2009-11-10T16:59:15.790 に答える
1

このリンクも読んでください。これも役立つかもしれません。

1 つ目はポリシー ファイルに関するもので、2 つ目は TELNET (つまり、ここには FTP はありません) クライアントの例です。

于 2009-09-20T10:43:59.127 に答える
0

これを解決するには、さらに情報が必要です..ここであなたが言っていることは、私には正しいようです。ただし、ByteArray ではなく、Socket クラスを使用してデータを送信しています。

データが送信されていませんか? どのように反応を受け取っていますか?うまく機能しているかもしれませんが、あなたはそれに気づいていませんか?私が言ったように、あなたがしていることについてもっと教えてください..

Lee Brimelow がgotoAndLearnで POP3 クライアントの作成に関するスクリーンキャストを公開しています。やっていることは基本的に同じですので、参考にしてください。

于 2008-09-15T17:12:57.830 に答える
0

正しく接続するには、FTP サーバーから CrossDomain ポリシー ファイルを提供する必要があります。

于 2008-10-21T23:19:20.103 に答える
0

私が収集したものから、次に進む前に、各コマンドを 1 つずつ送信し、応答を検証する必要があります。ProgressEvent.SOCKET_DATA に対して何かを返す必要があります

これだけを試して、応答がどうなるか見てみましょう。

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

次に、このように応答を読み上げます。

var response:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
于 2008-11-14T04:30:39.870 に答える
0

FTP 標準では、コマンドの最後に CRLF が必要です。例の「\n」の代わりに「\r\n」を使用してみてください。

于 2008-10-02T12:12:22.760 に答える
0

構文が正しいことを 100% 確信していますか? HTTP では、リクエストの後に余分な改行を含める必要があることを知っています。それがなければ、何も返ってきません。ただし、FTPの場合はどうなるかわかりません。

于 2008-09-16T17:27:44.387 に答える