Cet article présente comment utiliser les bibliothèques disponibles existantes en Java pour écrire le code client FTP et le développer dans des contrôles d'applet pour effectuer des commandes de téléchargement et de téléchargement de fichiers de lots basés sur le Web. Sur la base d'une série de bibliothèques de clients FTP, l'article fournit des explications détaillées et des implémentations de code sur l'une des bibliothèques J-FTP les plus courantes et puissantes, telles que les barres de progression, la continuation des points d'arrêt, la cartographie des réseaux internes et externes et les fonctions JavaScript de rappel dans Applet. On espère que cet article jouera un rôle dans l'attraction du jade.
1. Introduction
Lors de la mise en œuvre d'un projet, une exigence de téléchargement de fichiers et de téléchargement basée sur le Web est apparue. Les utilisateurs de la province (ou à l'échelle nationale) doivent télécharger certains fichiers sur le serveur de fichiers dans un certain centre. Ces documents sont utilisés pour une construction d'ingénierie à grande échelle, qui peut impliquer des projets de construction d'une valeur de dizaines de millions, voire des centaines de millions de yuan. Les fichiers ont trois caractéristiques distinctes: la première est que le fichier est grand, qui peut atteindre 50 m; La seconde est que le nombre de fichiers est important, ce qui peut être d'environ 15; Le troisième est que les signatures numériques et le chiffrement des données sont requis en termes de sécurité des données.
Tout d'abord, considérons la méthode de transmission basée sur HTTP. Cependant, par comparaison, j'ai rapidement constaté que les besoins ci-dessus étaient satisfaits:
1: Le téléchargement à l'aide du protocole HTTP semble être plus adapté à la commodité de programmation Web; Le téléchargement de fichiers inférieur à 1 m est légèrement plus rapide que le téléchargement de fichiers à l'aide du protocole FTP. Mais rien ne peut n'y avoir rien à faire concernant le transfert de lots et de fichiers volumineux. Bien sûr, il présente également ses avantages, comme contrairement à FTP, il est nécessaire de démarrer un service FTP côté serveur.
2: Le téléchargement de fichiers avec des fichiers supérieurs à 1 m à l'aide du protocole FTP est plus rapide que HTTP. Plus le fichier est grand, la vitesse de téléchargement sera plusieurs fois plus rapide que la vitesse de téléchargement HTTP. Et écrire des programmes en Java; FTP est plus pratique que HTTP.
L'auteur a utilisé une fois VB et a écrit des contrôles ActiveX pour télécharger et télécharger des fichiers de lots, et ses fonctions sont également très puissantes. C'est juste que comme il n'y a pas de signature numérique spéciale pour les fichiers CAB ou OCX, il est nécessaire d'effectuer des paramètres fastidieux pour le client, tels que la configuration d'un site sécurisé, réduisant le niveau de sécurité du client, etc., certaines solutions ont été abandonnées.
Dans le même temps, étant donné que les fichiers doivent être signés et chiffrés numériquement sur le client, il a été décidé d'utiliser Applet pour les implémenter. . Avant de télécharger le fichier, les informations de clé USBKEY locales peuvent être obtenues auprès du client pour terminer le traitement du cryptage et de la signature du fichier téléchargé. Bien que l'utilisation d'applet nécessite l'installation de l'environnement d'exécution JRE sur le client, ce qui apporte des inconvénients à la gestion et à l'utilisation du client, il peut être un prix relativement faible pour comparer la sécurité d'un si grand nombre de fichiers et de fichiers.
Pour résumer l'environnement de fonctionnement:
FTP Server Side: Serv-U, un programme professionnel du côté serveur FTP, il existe des téléchargements de logiciels prêts à l'emploi sur Internet, bien sûr, les lecteurs peuvent également rédiger un programme de réception de fichiers FTP côté serveur à expliquer. S'il n'y a pas d'exigences ou de fonctions particulières, Serv-U devrait être en mesure de répondre à nos besoins généraux de téléchargement et de téléchargement;
Client: Java Applet, une technologie qui a rendu Java populaire à l'époque, a affirmé être comparable à ActiveX de Microsoft. Bien sûr, maintenant Java a Java FX. Est-ce un substitut à Applet?
Environnement d'application: Internet, ultime objectif.
2. Choix de la bibliothèque client Java FTP
Imaginons un scénario - nous voulons écrire une application Java pure qui télécharge et télécharge des fichiers à partir d'un serveur FTP exécutant sur un ordinateur distant; Nous voulons également obtenir des informations de base de fichiers pour les fichiers distants à télécharger, tels que le nom de fichier, les données ou la taille du fichier.
Bien qu'il soit possible et peut-être intéressant d'écrire un gestionnaire de protocole FTP à partir de zéro, le travail est également difficile, long et potentiellement dangereux. Parce que nous ne voulons pas passer du temps, de l'énergie ou de l'argent pour écrire nous-mêmes un tel programme de traitement, nous nous tournons vers des composants réutilisables qui existent déjà. Et de nombreuses bibliothèques sont disponibles en ligne.
Trouver une excellente bibliothèque client Java FTP qui convient à nos besoins n'est pas aussi simple qu'il n'y paraît. Au contraire, c'est une tâche très douloureuse et compliquée. Tout d'abord, il faut un certain temps pour trouver une bibliothèque client FTP. Deuxièmement, après avoir trouvé toutes les bibliothèques existantes, laquelle devons-nous choisir? Chaque bibliothèque convient à différents besoins. Ces bibliothèques ne sont pas équivalentes à la performance et ont des différences fondamentales dans leur conception. Chaque bibliothèque a ses propres caractéristiques et utilise différents termes pour les décrire. Par conséquent, évaluer et comparer les bibliothèques clients FTP est une tâche difficile.
L'utilisation de composants réutilisables est une approche préconisée, mais dans ce cas, il est souvent décourageant au début. Plus tard, je pourrais avoir un peu honte: après avoir choisi une bonne bibliothèque FTP, le travail suivant est très simple, suivez simplement les règles simples. À l'heure actuelle, il existe de nombreuses bibliothèques clients FTP publiques et gratuites, telles que SimpleFTP, J-FTP, etc., et de nombreux autres FTPClients. Comme indiqué dans le tableau suivant, le tableau ne peut pas être répertorié. Si les lecteurs ont une meilleure bibliothèque de classe FTP client, veuillez faire d'autres suppléments.
Dans cet article, l'auteur adopte J-FTP. Il s'agit d'une bibliothèque FTP client open source et très puissante. L'auteur l'aime beaucoup et le recommande également à tous les lecteurs. Oubliez-le gratuitement et faites une publicité pour cela.
3. Fonctions de base
1. Connectez-vous
FTP est utilisé pour le transfert de fichiers, mais en substance, java.net.socket est utilisé pour la communication. Le code suivant n'est qu'une des méthodes de connexion de la classe net.sf.jftp.net.ftpconnection. Bien sûr, afin d'économiser la mise en page et d'expliquer clairement certains principes dans le code suivant, l'auteur a supprimé certains codes inutiles, tels que les journaux et autres codes. Pour le code complet, veuillez consulter le code source de J-FTP ou l'exemple de code source de l'auteur. Les exemples de code suivants sont les mêmes:
public int ligin (String username, String Motword) {this.userName = username; this.password = mot de passe; int status = login_ok; jCon = new JConnection (hôte, port); if (jCon.ithere ()) {in = jCon.getReader (); if (getLine (positif) == null) // ftp220_service_ready) == null) {ok = false; status = hors ligne; } if (! getline (loginack) .startswith (positif)) // ftp230_logged_in)) {if (succès (positif)) // ftp230_logged_in)) {} else {ok = false; status = malft_login_data; }}} else {if (msg) {log.debug ("ftp non disponible!"); ok = false; status = generic_failed; }} if (ok) {connected = true; système(); binaire(); String [] advsettings = new String [6]; if (getOsType (). indexof ("os / 2")> = 0) {list_default = "list"; } if (list.equals ("default")) {// Il suffit d'obtenir le premier élément (il sait d'abord que la commande // ftp list) advsettings = lostset.loadSet (settings.adv_settings); // *** Si le fichier n'est pas trouvé, créez-le et définissez-le sur list_default if (advsettings == null) {list = list_default; SaveSet S = new SaveSet (settings.adv_settings, liste); } else {list = advsettings [0]; if (list == null) {list = list_default; }}} if (getOsType (). indexof ("mvs")> = 0) {list = "list"; } // *** fineIrectoryupdate (this); FireConnectionInitialized (this); } else {FireConnectionFailed (this, nouvel entier (statut) .toString ()); } statut de retour; } Dans cette méthode de connexion, il existe une classe JConnection, qui est responsable de l'établissement de socket sockets. En même temps, cette classe est un fil séparé. L'avantage est que pour coopérer avec les changements d'interface, les connexions de socket réseau et d'autres tâches sont traitées comme des threads séparés, ce qui est propice à la convivialité de l'interface. Vous trouverez ci-dessous la méthode d'exécution de la classe net.sf.jftp.net.jconnection. Bien sûr, le démarrage de ce fil est démarré dans le constructeur de la classe JConnection.
public void run () {try {s = new socket (host, port); localport = s.getLocalport (); // if (temps> 0) s.SetSoTimeout (temps); out = new PrintStream (new BufferedOutputStream (s.getOutputStream (), settings.buffeSize)); dans = new BufferedReader (new inputStreamReader (s.getInputStream ()), Settings.BuffeSize); ISOK = true; //}} catch (exception ex) {ex.printStackTrace (); Log.out ("Warning: Connexion clôturée en raison de l'exception (" + hôte + ":" + port + ")"); ISOK = false; essayez {if ((s! = null) &&! s.isclosed ()) {s.close (); } if (out! = null) {out.close (); } if (in! = null) {in.close (); }} catch (exception ex2) {ex2.printStackTrace (); Log.out ("AVERTISSEMENT: j'ai plus d'erreurs en essayant de fermer le socket et les flux"); }} établi = true; }Le socket de cette méthode d'exécution expliquera ici que ce type de mise en œuvre de sockets clients (également appelé "sockets"), qui sont des points de terminaison de communication entre deux machines. Le travail réel de la prise est effectué par une instance de la classe socketimpl. Une application implémente une usine de socket qui crée des sockets en modifiant l'usine de socket qui peut se configurer pour créer des sockets adaptés au pare-feu local. Pour des instructions spécifiques, veuillez vous référer aux instructions de l'API de JDK5, de préférence en chinois. hehe.
2 Télécharger et télécharger
Le téléchargement des fichiers peut être divisé en multi-thread et unique, ce qui est relativement simple dans des situations à thread unique, tandis que dans des situations multiples, plus de choses à gérer et plus prudents. Vous trouverez ci-dessous la méthode de téléchargement HandleUpload de net.sf.jftp.net.ftpconnection. Deux types différents, un seul thread et multi-thread, ont été pris en compte.
public int handleupload (file de chaîne, chaîne realName) {if (settings.getEnableMultithReading () && (! Settings.getNouploadMultithReading ())) {log.out ("Spawning New Thread pour ce téléchargement."); Ftptransfer t; if (realName! = null) {t = new ftptransfer (hôte, port, getLocalPath (), getCachedPwd (), fichier, nom d'utilisateur, mot de passe, transfer.upload, gestionnaire, écouteurs, realName, crlf); } else {t = new ftptransfer (hôte, port, getLocalPath (), getCachedPwd (), fichier, nom d'utilisateur, mot de passe, transfert.upload, gestionnaire, auditeurs, crlf); } LastTransfer = T; return new_transfer_spawned; } else {if (settings.getNouploAdMultithReading ()) {log.out ("télécharger le multithreading est désactivé."); } else {log.out ("Multithreading est complètement désactivé."); } return (realName == null)? upload (fichier): upload (file, realName); }} Dans le cas du multi-threading, il existe une classe distincte net.sf.jftp.net.ftptransfer. Bien sûr, dans le cas du multi-threading, cette classe doit être un fil séparé. Semblable à JConnection, le démarrage de son fil est également démarré dans le constructeur. Dans sa méthode d'exécution, le fichier est lu et transmis.
public void run () {if (handler.getConnections (). get (file) == null) {handler.addconnection (fichier, this); } else if (! Pause) {log.debug ("transfert déjà en cours:" + fichier); travail = false; stat = 2; retour; } boolean haspaused = false; while (pause) {try {runner.sleep (100); if (auditeurs! = null) {for (int i = 0; i <écouteurs.size (); i ++) {((connexionListener) auditers.elementat (i)). UpdatedProgress (fichier, paused, -1); }} if (! work) {if (auditeurs! = null) {for (int i = 0; i <auditers.size (); i ++) {((connectionListener) auditers.elementat (i)). updateProgress (fichier, supprimé, -1); }}}} catch (exception ex) {} haspaused = true; } while ((handler.getConnectionsize ()> = settings.getMaxConnections ()) && (handler.getConnectionsize ()> 0) && work) {try {stat = 4; Runner.Sleep (400); if (! haspaused && (auditeurs! = null)) {for (int i = 0; i <auditers.size (); i ++) {((connectionListener) auditers.elementat (i)). updatedProgress (file, filed, -1); }} else {Break; }} catch (exception ex) {ex.printStackTrace (); }} if (! work) {if (auditeurs! = null) {for (int i = 0; i <auditers.size (); i ++) {((connectionListener) auditers.elementat (i)). updateProgress (fichier, supprimé, -1); }} handler.RemoveConnection (fichier); stat = 3; retour; } démarré = true; essayez {Runner.Sleep (settings.ftptransferThreadPause); } catch (exception ex) {} con = new ftpconnection (hôte, port, remotepath, crlf); con.setConnectionHandler (gestionnaire); con.setConnectionListeners (auditeurs); int status = con.login (utilisateur, pass); if (status == ftpconnection.login_ok) {fichier f = nouveau fichier (localPath); con.setLocalPath (f.getAbsolutepath ()); if (type.equals (upload)) {if (newname! = null) {transferstatus = con.upload (file, newname); } else {transferstatus = con.upload (fichier); }} else {transferstatus = con.download (fichier, this.newname); }} if (! Pause) {handler.RemoveConnection (fichier); }} Quant au processus de téléchargement, car il s'agit d'un processus de téléchargement inverse, il est similaire à la méthode de téléchargement et à la méthode d'écriture. Pour certaines raisons, le code n'est pas répertorié, mais ses idées et ses idées sont exactement les mêmes. Veuillez vous référer au code source des lecteurs.
4. Bar de progression
On peut imaginer que s'il n'y a pas d'invite pendant le processus de téléchargement ou de téléchargement, l'utilisateur ne peut pas juger si la tâche est terminée ou si la tâche est morte, et l'utilisateur est souvent trompeur en raison du temps de téléchargement ou du temps de téléchargement trop long. Par conséquent, la barre de progrès est très importante et pratique.
La mise en œuvre de la barre de progrès est en fait très simple. Il s'agit d'ouvrir deux fils du programme. Le premier thread est utilisé pour modifier dynamiquement la valeur de la barre de progression sur l'interface, tandis que le deuxième thread forme une boucle pendant le processus de téléchargement ou de téléchargement. Dans cette boucle, un certain nombre de données telles que 8192 octets sont lues à chaque fois. Ensuite, après avoir passé ces données, appelez la méthode UpdateProgress dans le premier thread pour mettre à jour la valeur de la barre de progression de l'interface.
Pendant le processus de téléchargement ou de téléchargement (voir la méthode d'exécution de la classe ftptransfer dans la section précédente), vous pouvez afficher la méthode CON.upload (fichier, newname), le code est le suivant.
public int upload (file string, string realName, inputStream in) {hasuploaded = true; Log.out ("FTP Téléchargement démarré:" + This); int stat; if ((in == null) && new file (fichier) .isDirectory ()) {shortprogress = true; fileCount = 0; BaseFile = fichier; dataType = dataconnection.putdir; isDirupload = true; stat = uploadDir (fichier); shortprogress = false; //System.out.println(fileCount + ":" + BaseFile); FIREPROGRESSUPDATE (BaseFile, DataConnection.dfinished + ":" + FileCount, -1); FireActionfinished (ceci); FireDirectoryUpdate (ceci); } else {dataType = dataConnection.put; stat = rawupload (fichier, realName, in); essayez {thread.sleep (100); } catch (exception ex) {} FireActionFinied (this); FireDirectoryUpdate (ceci); } essayez {Thread.Sleep (500); } catch (exception ex) {} return stat; }Cette méthode est responsable du téléchargement d'un certain nombre d'octets. En fait, il est appelé la méthode Rawupload. Il n'est pas répertorié ici. Veuillez vous référer au code source. Après avoir passé ces données d'octets, la méthode UpdateProgressBar () dans le thread principal est appelée en appelant la méthode FireActionFinied (). En fait, le code est le suivant:
Protected void updateProGressBar () {int pour cent = (int) (((float) lFileCompleTeSize / (float) lfileSize) * 10000f); pbFile.SetValue (pour cent); // System.out.println ("===================================================================. pbFile.SetString (lFileCompleTeSize / 1024L + "/" + lfilesize / 1024l + "kb"); pour cent = (int) (((float) ltotalCompleTize / (float) ltotalsize) * 10000f); PBTOTAL.SETSTRING (LTOTALCOMPLETESIZE / 1024L + "/" + LTOTALSIZE / 1024L + "KB"); pbtotal.setValue (pourcentage); repeindre(); } Deux barres de progrès sont utilisées ci-dessus. La première barre de progrès représente la progression de téléchargement ou de téléchargement du fichier actuel, et la deuxième barre de progrès représente la progression de tous les fichiers téléchargement ou téléchargement. Dans le même temps, afin de générer une progression ou un changement de progression plus évidente, la valeur maximale de la barre de progrès est définie à 10 000 via PBFile.setMaxim (10000) et Pbtotal.setMaxim (10000), plutôt que le 100 que nous définissons habituellement. L'auteur estime que c'est mieux, car parfois lors du téléchargement ou du téléchargement, les modifications peuvent être relativement faibles pour des raisons de réseau. Si elle est définie sur 100, le changement n'est pas particulièrement évident.
Ce qui précède est l'article de base pour le téléchargement et le téléchargement de grands lots de fichiers FTP. J'espère que cela sera utile à l'apprentissage de tous, et j'espère que tout le monde soutiendra davantage Wulin.com.