Travailler avec le protocole FTP sous Android. Exemple

Bonjour à tous! Ce sera un tout petit article. Notre tâche ici est de se connecter à un serveur FTP local (j'ai choisi FileZilla) et d'y envoyer quelque chose en utilisant (évidemment) le protocole FTP.



Donc, une goutte de théorie



FTP (File Transfer Protocol) est un protocole de transfert de fichiers réseau.

FTP en nécessite deux: un serveur FTP et un client FTP.



Le serveur permet d'accéder par login et mot de passe aux fichiers nécessaires et, par conséquent, n'affiche à l'utilisateur que les fichiers et dossiers auxquels il a accès.

Le client est un programme de connexion FTP. L'idée principale est que l'utilisateur peut opérer sur les données du fichier côté serveur: visualiser, éditer, copier, télécharger et supprimer.



Tout est logique.



Contrairement, disons, au même HTTP, FTP utilise une double connexion comme modèle de connexion. Dans ce cas, un canal est celui de contrôle, par lequel les commandes sont reçues au serveur et ses réponses sont renvoyées (généralement via le port TCP 21), et par le reste, le transfert de données réel a lieu, un canal pour chaque transfert. Ainsi, dans le cadre d'une session via le protocole FTP, plusieurs fichiers peuvent être transférés simultanément, et dans les deux sens.



Si vous décrivez le processus d'établissement d'une connexion et de transfert de données point par point, vous obtenez quelque chose comme ce qui suit:



  1. L'utilisateur active l'application cliente et se connecte au serveur en entrant un nom d'utilisateur et un mot de passe.
  2. — .
  3. , FTP- ( , FTP — , , ), , (, , , ..).
  4. ( , ), , FPT — , .

    .
  5. Une fois le transfert terminé, cette connexion est fermée, mais le canal de contrôle entre les interprètes reste ouvert, ce qui permet à l'utilisateur de rouvrir le transfert de données dans la même session.


FTP - la connexion par défaut est le port 21, sauf si un autre port est défini.



image



Mise en œuvre



Dans ce cas, nous utiliserons la classe FTPClient de la bibliothèque Apache (org.apache.commons.net.ftp.FTPClient). Nous créons un objet de la classe, définissons un délai. Ensuite, nous devons d'abord nous connecter au serveur en utilisant connect avant de faire quoi que ce soit (et n'oubliez pas de vous déconnecter une fois que nous avons terminé). Dans connect, comme premier paramètre, nous écrivons l'adresse locale de l'hôte, le deuxième argument est le port de connexion. Vous devez également vérifier le code de réponse FTP (trop évident, mais quand même) pour vous assurer que la connexion a réussi.



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)) {
                // 
        }

      
      





Ok, nous sommes connectés au serveur. Et après? Vous devez maintenant passer par l'autorisation sous le nom d'utilisateur, que nous avons en fait créé pour cela. Mais avant cela, vous devez définir le mode de connexion de données actuel sur PASSIVE_LOCAL_DATA_CONNECTION_MODE à l'aide de la commande enterLocalPassiveMode (). Cela signifie que tous les transferts auront lieu entre le client et le serveur, et que le serveur est en mode passif, attendant que le client se connecte pour lancer le transfert. (par exemple, ACTIVE_LOCAL_DATA_CONNECTION_MODE implique que le serveur lancera la connexion).



Après cela, dans la connexion, écrivez le nom d'utilisateur et le mot de passe. storeFile () stocke le fichier sur le serveur en utilisant le nom donné et en acceptant l'entrée du InputStream donné. J'avais une tâche pour écrire périodiquement dans un fichier spécifique sur le serveur, donc cela ressemble à ceci:



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()
            }
      
      





Si vous souhaitez copier votre fichier sur le serveur dans son intégralité, vous pouvez le faire (l'essence ne change pas beaucoup, mais du coup quelqu'un en a besoin):



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

      
      





Dans l'ensemble, c'est tout ce dont vous pourriez avoir besoin. Et, bien sûr, un peu sur la configuration d'un serveur FTP local. J'ai ceci, comme je l'ai écrit plus tôt, FileZilla. Nous laissons tout par défaut. Créez un utilisateur et attribuez-lui un dossier sur l'hôte, à partir duquel il peut lire / écrire / supprimer, etc.



image



C'est tout. Lancez et affichez les journaux sur le serveur. Et voici ce que vous devriez obtenir:



image



bonne chance!



All Articles