AndroidでFTPプロトコルを使用する。例

みなさん、こんにちは!これは非常に小さな記事になります。ここでのタスクは、ローカルFTPサーバー(私はFileZillaを選択しました)に接続し、(明らかに)FTPプロトコルを使用してそこに何かを送信することです。



だから、理論の一滴



FTP(ファイル転送プロトコル)は、ネットワークファイル転送プロトコルです。

FTPには、FTPサーバーとFTPクライアントの2つが必要です。



サーバーは、ログインとパスワードによる必要なファイルへのアクセスを提供し、したがって、ユーザーがアクセスできるファイルとフォルダーのみをユーザーに表示します。

クライアントはFTP接続用のプログラムです。主なアイデアは、ユーザーがサーバー側のファイルデータ(表示、編集、コピー、ダウンロード、削除)を操作できることです。



すべてが論理的です。



たとえば、同じHTTPとは異なり、FTPは接続モデルとして二重接続を使用します。この場合、1つのチャネルが制御チャネルであり、これを介してコマンドがサーバーに受信され、その応答が返され(通常はTCPポート21を介して)、残りのチャネルを介して実際のデータ転送が行われ、転送ごとに1つのチャネルが行われます。したがって、FTPプロトコルを介した1つのセッションのフレームワーク内で、複数のファイルを同時に双方向に転送できます。



接続を確立し、さらにデータをポイントごとに転送するプロセスを説明すると、次のようになります。



  1. ユーザーはクライアントアプリケーションをアクティブ化し、ユーザー名とパスワードを入力してサーバーに接続します。
  2. — .
  3. , FTP- ( , FTP — , , ), , (, , , ..).
  4. ( , ), , FPT — , .

    .
  5. 転送が完了すると、この接続は閉じられますが、インタープリター間の制御チャネルは開いたままになります。その結果、ユーザーは同じセッション内でデータ転送を再開できます。


FTP-別のポートが設定されていない限り、デフォルトの接続はポート21です。



画像



実装



この場合、Apacheライブラリ(org.apache.commons.net.ftp.FTPClient)のFTPClientクラスを使用します。クラスのオブジェクトを作成し、タイムアウトを設定します。次に、何かを行う前に、まずconnectを使用してサーバーに接続する必要があります(完了したら、必ず切断してください)。 connectでは、最初のパラメーターとしてホストのローカルアドレスを書き込み、2番目の引数は接続用のポートです。また、FTP応答コードをチェックして(あまりにも明白ですが、それでも)、接続が成功したことを確認する必要があります。



import org.apache.commons.net.ftp.FTP
import org.apache.commons.net.ftp.FTPClient
import org.apache.commons.net.ftp.FTPReply

...

val con = FTPClient()
        con.connectTimeout = 
        con.connect("192.168.0.105", 21)
        if (FTPReply.isPositiveCompletion(con.replyCode)) {
                // 
        }

      
      





はい、サーバーに接続しています。次は何ですか?次に、実際にこのために作成したユーザー名で認証を行う必要があります。ただし、その前に、enterLocalPassiveMode()コマンドを使用して、現在のデータ接続モードをPASSIVE_LOCAL_DATA_CONNECTION_MODEに設定する必要があります。これは、すべての転送がクライアントとサーバー間で行われ、サーバーがパッシブモードであり、クライアントが接続して転送を開始するのを待機していることを意味します。 (たとえば、ACTIVE_LOCAL_DATA_CONNECTION_MODEは、サーバーが接続を開始することを意味します)。



その後、ログイン時にユーザー名とパスワードを入力します。storeFile()は、指定された名前を使用し、指定されたInputStreamからの入力を受け入れるファイルをサーバーに格納します。サーバー上の特定のファイルに定期的に書き込むタスクがあったので、次のようになります。



con.enterLocalPassiveMode()
                if (con.login("nad", "nad")) { //    (,     )
                    con.setFileType(FTP.BINARY_FILE_TYPE)
                    val msg = "your_msg"
                    val msg_bytes: InputStream = ByteArrayInputStream(msg.toByteArray())
                    val result: Boolean = con.storeFile("/sms.txt", msg_bytes)
                    msg_bytes.close()
                    if (result) Log.v("upload result", "succeeded")
                    con.logout()
                    con.disconnect()
                }
            }
             catch (ex: IOException) {
                ex.printStackTrace()
                return Result.failure()
            }
      
      





ファイル全体をサーバーにコピーしたい場合は、これを行うことができます(本質はあまり変わりませんが、突然誰かがそれを必要とします):



val file = File("  ")
val msg_bytes = FileInputStream(file)

      
      





全体として、これがあなたが必要とするかもしれないすべてです。そしてもちろん、ローカルFTPサーバーのセットアップについても少し説明します。以前書いたように、私はこれを持っています、FileZilla。デフォルトではすべてを残します。ユーザーを作成し、ホスト上のフォルダーを割り当てます。このフォルダーから、読み取り/書き込み/削除などを行うことができます。



画像



それで全部です。サーバーでログを起動して表示します。そして、これがあなたが得るべきものです:



画像



頑張ってください!



All Articles