Ensuite, l'article précédent sera téléchargé et téléchargé.
5. Reprendre le point de rupture
Pour les programmeurs qui connaissent QQ, la fonction de transmission continue de QQ à point d'arrêt devrait être très impressionnante. Parce que c'est très pratique et aspect. Par conséquent, lors de notre processus de téléchargement et de téléchargement, la fonction de la transmission continue de point d'arrêt est très bien mise en œuvre.
En fait, le principe de la transmission continue du point d'arrêt est très simple. Pendant le processus de téléchargement, accédez au service pour savoir s'il existe ce fichier. Si certains fichiers existent, comparez la taille du fichier sur le serveur avec la taille du fichier local. Si les fichiers du serveur sont plus petits que celui local, on pense que la transmission continue de point d'arrêt devrait être possible pendant le processus de téléchargement de ce fichier.
Pendant la mise en œuvre, la classe RandomAccessFile devient utile. Instances de cette classe Prise en charge de la lecture et de l'écriture dans des fichiers d'accès aléatoire. Les fichiers d'accès aléatoire se comportent comme un grand tableau d'octets stocké dans le système de fichiers. Il y a un curseur ou un index pointant vers le tableau implicite, appelé pointeur de fichier; L'opération d'entrée lit les octets à partir du pointeur de fichier et fait avancer le pointeur de fichier lorsque l'octet est lu. Si le fichier d'accès aléatoire est créé en mode lecture / écriture, l'opération de sortie est également disponible; L'opération de sortie commence par le pointeur de fichier et fait progresser le pointeur de fichier lorsque l'octet est écrit. Une opération de sortie après avoir écrit à l'extrémité actuelle d'un tableau implicite fait se développer le tableau. Le pointeur de fichier peut être lu via la méthode GetFilePointer et définir la méthode de recherche.
La méthode SkipBytes de la classe RandomAccessFile essaie de sauter n octets d'entrée pour jeter les octets sautés. Si vous trouvez que la taille N du fichier soit téléchargée à partir du serveur, vous pouvez utiliser la méthode skipbytes pour ignorer ces n octets et commencer à effectuer une transmission continue à point d'arrêt à partir d'un nouvel endroit. Pour des méthodes spécifiques, veuillez vous référer à la description de l'API de JDK5.
Vous pouvez voir la mise en œuvre du téléchargement et du téléchargement de la transmission continue du point d'interruption dans la méthode d'exécution de la classe DataConnection. Le code est le suivant:
public void run () {try {newline = con.getcrlf (); if (settings.getftPPasvMode ()) {try {sock = new socket (host, port); sock.SetSoTimeout (settings.getsockettimeout ()); } catch (exception ex) {ok = false; Debug ("Impossible d'ouvrir la prise sur le port" + port); }} else {//log.debug("trying new server socket: "+ port); essayez {ssock = new serversocket (port); } catch (exception ex) {ok = false; Log.Debug ("Impossible d'ouvrir SERVERSocket sur le port" + port); }}} catch (exception ex) {debug (ex.toString ()); } isthere = true; booléen ok = true; RandomAccessFile fout = null; BufferedOutputStream Bout = null; RandomAccessfile fin = null; essayez {if (! Settings.getftPPasvMode ()) {int rery = 0; while ((retry ++ <5) && (sock == null)) {try {ssock.setsoTimeout (settings.connectionTimeout); sock = ssock.accept (); } catch (ioException e) {sock = null; Debug ("Got ioException tout en essayant d'ouvrir une prise!"); if (retry == 5) {debug ("La connexion a échoué, essayé 5 fois - peut-être essayer un délai d'attente plus élevé dans Settings.java"); } fini = true; jeter e; } enfin {ssock.close (); } debug ("tentative timide, réessayant"); }} if (ok) {byte [] buf = new byte [settings.buffeSize]; start = System.currentTimemillis (); int buflen = 0; // --------------- Télécharger , 下载 ---------------------- if (type.equals (get) || type.equals (getDir)) {if (! JustStream) {try {if (ressume) {file f = new File (fichier); fout = new randomaccessfile (fichier, "rw"); fout.skipbytes ((int) f.length ()); buflen = (int) f.length (); } else {if (localfile == null) {localfile = file; } Fichier f2 = nouveau fichier (settings.apphomedir); f2.mkDirs (); Fichier f = nouveau fichier (localfile); if (f.exists ()) {f.delete (); } boout = new BufferedOutputStream (new FileOutputStream (localfile), Settings.BuffeSize); }} catch (exception ex) {debug ("Can’t Create OutputFile:" + file); ok = false; ex.printStackTrace (); }} // --------------- Téléchargez , 上传 ---------------------- if (type.equals (put) || type.equals (putDir)) {if (in == null) {try {fin = new randomaccessfile (file, "r"); if (ressume) {fin.skipbytes (skiplen); } // fin = new BufferedInputStream (new FileInputStream (fichier)); } catch (exception ex) {debug ("Can’t ouvrir InputFile:" + "(" + ex + ")"); ok = false; }} if (ok) {try {out = new BufferedOutputStream (sock.getOutputStream ()); } catch (exception ex) {ok = false; Debug ("Can't Get OutputStream"); } If (ok) {try {int len = skiplen; Char B; while (true) {int lic; if (in! = null) {read = in.read (buf); } else {read = fin.read (buf); } len + = read; //System.out.println(file + "" + type + "" + len + "" + read); if (read == -1) {break; } if (newline! = null) {byte [] buf2 = modifyput (buf, lecture); out.write (buf2, 0, buf2.length); } else {out.write (buf, 0, lecture); } con.fireProgressupDate (fichier, type, len); if (time ()) {// log.debugsize (len, false, false, fichier); } if (read == streamTokenizer.tt_eof) {break; }} out.flush (); //Log.debugsize(len, false, true, fichier); } catch (ioException ex) {ok = false; Debug ("Erreur: connexion de données fermée."); con.fireprogressupdate (fichier, échoué, -1); ex.printStackTrace (); }}}}}}} catch (ioException ex) {log.debug ("Impossible de connecter le socket à Serversocket"); ex.printStackTrace (); } enfin {try {if (out! = null) {out.flush (); out.close (); }} catch (exception ex) {ex.printStackTrace (); } essayez {if (mout! = null) {mout.flush (); bloout.close (); }} catch (exception ex) {ex.printStackTrace (); } essayez {if (fout! = null) {fout.close (); }} catch (exception ex) {ex.printStackTrace (); } essayez {if (in! = null &&! JustStream) {in.close (); } if (fin! = null) {fin.close (); }} catch (exception ex) {ex.printStackTrace (); }} essayez {sock.close (); } catch (exception ex) {debug (ex.toString ()); } if (! Settings.getftPPasvMode ()) {try {ssock.close (); } catch (exception ex) {debug (ex.toString ()); }} fini = true; if (ok) {con.fireProgressupDate (fichier, fini, -1); } else {con.fireprogressupdate (fichier, a échoué, -1); }} 6. Mappage du port FTP
Il existe deux types de connexions de données FTP: PASV et Port. Si votre serveur FTP est situé dans l'intranet, vous devez utiliser le mappage de port. Au début, je ne savais pas grand-chose sur la cartographie du réseau externe de FTP, alors j'ai commencé à prendre beaucoup de détours. Au début, j'ai toujours pensé qu'il y avait quelque chose qui ne va pas avec mon programme et a perdu beaucoup de temps. J'espère qu'au cours de cette période, tout le monde peut passer moins ou pas de temps et d'énergie inutiles pendant le développement.
Il y avait un article sur PCD qui a introduit une méthode pour accéder directement à l'intranet. En fait, tant que nous utilisons l'outil de cartographie du port, nous pouvons facilement atteindre le but de pénétrer l'intranet. "Port Mapper" est un tel outil. Ce qui mérite le plus de mentionner, c'est qu'il se débarrasse du mode de ligne de commande et fournit un environnement de fonctionnement d'interface graphique.
Afin de faire en sorte que tout le monde comprenne davantage, permettez-moi d'abord de parler du principe. Supposons qu'il y ait maintenant un LAN avec l'hôte A. En plus de l'hôte, il y a aussi une machine dans le LAN avec B. Bien sûr, la machine B surfait sur Internet via l'hôte A. Il existe également une machine qui peut accéder à l'Internet, qui ne peut pas pénétrer dans le même LAN que A et B. Normalement, la machine C peut uniquement accéder à l'hôte A, mais ne peut pas pénétrer dans le LAN et accéder à B. After Port Mapping, lorsque une machine C accède au port spécifié de l'hôte. Il transférera les données sur le port spécifié vers le port spécifié d'une autre machine dans le LAN, atteignant ainsi le but d'accéder à la machine Intranet. En disant de cette façon, tout le monde comprend. Quant à la façon de le configurer, l'auteur estime que cela ne devrait pas être une tâche difficile. En outre, il existe de nombreuses explications graphiques de ce type sur Internet. Veuillez vous référer aux articles sur Internet pour la mise en place.
Bien sûr, les avantages de réaliser l'accès direct à l'intranet sont évidents. Sans parler de rien d'autre, au moins les ressources FTP sont pleinement utilisées. Cependant, il faut rappeler que l'accès direct à l'intranet peut menacer la sécurité de l'intranet. L'auteur estime que la plupart des amis attachent toujours l'importance à l'importance de la sécurité de l'hôte, mais ils ignorent souvent les paramètres de sécurité des machines intranet. Une fois que vous avez atteint un accès direct à l'intranet, vous devez traiter les machines intranet comme un hôte, sinon votre réseau entier peut être en danger.
Accéder aux ressources des clients
La politique de sécurité de l'environnement d'application Java, qui est exprimée par un objet politique pour les autorisations de différentes ressources appartenant à différents codes. Pour que Applet (ou une application exécutée sous SecurityManager) effectue des comportements protégés, tels que la lecture et la rédaction de fichiers, l'applet (ou les applications Java) doit obtenir l'autorisation de cette opération, et le fichier de politique de sécurité est utilisé pour implémenter ces autorisations.
Un objet politique peut avoir plusieurs entités, bien qu'un seul puisse fonctionner à tout moment. L'objet politique actuellement installé peut être obtenu dans le programme en appelant la méthode GetPolicy ou modifié en appelant la méthode SetPolicy. L'objet de stratégie évalue l'intégralité de la stratégie, renvoyant un objet d'autorisations approprié qui détaille quel code peut accéder aux ressources. Les fichiers de stratégie peuvent être stockés dans des fichiers ASCII non formatés ou dans des fichiers binaires ou des bases de données de la classe de stratégie. Cet article ne traite que de la forme de fichiers ASCII non formatés.
Dans une utilisation réelle, nous n'avons pas besoin d'écrire manuellement des fichiers Java.policy complexes, surtout lorsque nous n'utilisons pas de signatures numériques. À l'heure actuelle, nous pouvons apprendre complètement des fichiers c: / programme prêts à l'emploi / java / jre1.5.0_12 / lib / security / java.policy qui nous est fourni par JRE et apporter des modifications correspondantes en fonction de nos besoins. Cet article rédigera un dossier de politique de sécurité pour la situation où les signatures numériques ne sont pas utilisées. Vous trouverez ci-dessous un fichier Java.Policy complet utilisé sous Windows NT / XP. Dans le fichier, le but de chaque enregistrement "autorisation" est expliqué séparément à l'aide de commentaires. Bien sûr, différents programmes peuvent avoir des exigences différentes pour les droits d'accès aux ressources et peuvent être ajustés et sélectionnés en fonction des besoins du projet.
Grant {// Permission de "lire" l'autorisation du système et du répertoire utilisateur java.util.propertypermission "user.dir", "read"; permission java.util.propertypermission "user.home", "lire"; permission java.util.propertypermission "java.home", "lire"; permission java.util.propertypermission "java.home", "lire"; autorisation java.util.propertypermission "java.class.pat", "lire"; permission java.util.propertypermission "user.name", "lire"; // Autorisations d'opération sur les threads et les groupes de threads autorisation java.lang.runtimePermimission "AccessClassInpackage.sun.misc"; Autorisation java.lang.runtimePermimission "AccessClassInpackage.sun.audio"; Autorisation java.lang.runtimePermimission "ModifyThread"; Autorisation java.lang.runtimePermimission "ModifyThreadGroup"; Permission java.lang.runtimePermimission "LoadLibrary. *"; // l'autorisation de lire et d'écrire des fichiers autorisation java.io.filepermission "<< tous les fichiers >>", "lire"; Permission java.io.filepermission "$ {user.dir} $ {/} jmf.log", "write"; Permission java.io.filepermission "$ {user.home} $ {/}. jmstudiocfg", "write"; permission java.net.socketpermission "*", "connecter, accepter"; Permission java.io.filepermission "c: / winnt / temp / *", "write"; Permission java.io.filepermission "c: / winnt / temp / *", "supprimer"; permission java.awt.awtpermission "showwindowwithoutwarningbanner"; Autorisation javax.sound.sampled.audiopermission "enregistrement"; // // diverses autorisations pour les ports de socket de fonctionnement autorisation java.net.socketpermission "-", "écouter"; permission java.net.socketpermission "-", "accepter"; permission java.net.socketpermission "-", "connect"; permission java.net.socketpermission "-", "résoudre"; Permission Java.Security.AllPermission; }; Grant Signed par "Saili" {Permission java.net.socketpermission "*: 1024-65535", "connecter, accepter, résoudre"; Permission java.net.socketpermission "*: 80", "connect"; Permission java.net.socketpermission "-", "écouter, accepter, connecter, écouter, résoudre", signé "ganja"; permission java.net.socketpermission "-", "accepter"; permission java.net.socketpermission "-", "connect"; permission java.net.socketpermission "-", "résoudre"; Permission Java.Security.AllPermission; }; Dans ce projet, afin de le rendre plus pratique et simple à utiliser les paramètres utilisateur du client, le fichier ci-dessus est transformé en un petit programme à l'aide de VB ou C #. Combinez ensuite JRE et quelques ex dans un package EXE. Une fois l'installation de la JRE, cette applet est responsable de la recherche du chemin d'installation de JRE dans le système d'exploitation et d'écrire le fichier java.policy dans le programme pour écraser le fichier d'origine. De cette façon, l'utilisateur n'a besoin que d'installer un fichier EXE, ce qui simplifie le nombre d'opérations d'installation.
7. Serveur de rappel d'applet
La capacité de JavaScript et d'applet à communiquer entre elles nous apporte beaucoup de commodité. Java et JavaScript se complètent pour développer des applications Web plus parfaites. B / S peut utiliser pleinement les avantages de Java, nous offrant plus d'expérience en réseau et le rendant pratique pour les utilisateurs. L'auteur utilise plus d'applications développées par des composants de swing pour implémenter l'architecture B / S à l'aide d'Applet, qui peut entièrement démontrer les avantages des composants de swing, faciliter les mises à niveau du système et maintenir; De plus, sous le Web, le client doit parfois utiliser des ressources matérielles locales. Ce que je sais, c'est qu'il est implémenté via Applet et appelle l'API Java via Applet. Voyons comment JavaScript et Applet communiquent en détail?
1. Javascript Accès à l'applet
<applet name = "AppletName" .... /// JavaScript accède aux propriétés de l'applet.
Window.Document.appletName.AppletField (la propriété doit être publique, "Window.Document" "peut également être écrit sans écrire) // Accès javascript à la méthode de l'applet.
Window.Document.AppletName.AppletMethod (la méthode doit être publique, "Window.Document". Peut également être écrit sans écrire).
2. Appareil accès à JavaScript
Live Connect fournit une interface entre Java et JavaScript, qui permet à JavaScript d'être utilisé dans les applets d'applet Java.
Vous devez utiliser un package JAR et le rechercher dans les fichiers C: / Program / Java / Directory. Il est environ 5m. En fait, c'est juste pour l'ouvrir pour voir lequel a netscape.javascript.jsobject. Si vous n'avez pas installé Netscape ou si vous pouvez le faire en ligne ou hors ligne. Vous pouvez le renommer à netscape.jar (pas nécessaire), et vous devez être ajouté à ClassPath, dans le but de le faire compilé pendant le développement. Il est particulièrement important de noter que netscape.jar ne doit pas être inclus pendant le déploiement, car l'ensemble du package sera téléchargé sur le client, affectant la vitesse.
// introduire la classe NetScape Importation netscape.javascript.jsObject; Importer netscape.javascript.jsexception; // il peut être autorisé à gérer les événements d'exception dans les applets public void calljavascript (string callbackjavascript) {jsObject window = jsObject.getWindow (this); // Obtenez la poignée de la fenêtre JavaScript et consultez la fenêtre de document actuelle jsobject document = (jsObject) window.getMember ("document"); form = (jsObject) doc.getMember ("textform"); // accéder à l'objet JavaScript Form TextField = (jsObject) form.getMember ("TextField"); accéder au texte de l'objet texte javascript = (String) textField.getMember ("Value"); // Obtenez la valeur de la zone de texte // Appelez la méthode Alert () de JavaScript // Window.eval ("alert (/" Cette alerte vient de Java! / ")"); window.call (callbackjavascript, null); // Les paramètres sont représentés sous la forme d'un tableau. }8. Effet de fonctionnement
1. Télécharger
(1). Démarrage de démarrage
(2). Téléchargement
(3). Téléchargement
(4). Télécharger avec succès
2. Télécharger
(1) Enregistrer le chemin de téléchargement du fichier de téléchargement
(2) Téléchargement
(3) téléchargement
(4) Télécharger avec succès
9. Résumé
Dans cet article, l'auteur expliquera la solution au problème de téléchargement et de téléchargement dans les projets réels, et utilisera le protocole FTP pour réaliser le lot, le téléchargement et le téléchargement de fichiers Web de base. Dans le même temps, il peut accéder aux ressources locales sur le client via la technologie Applet. Une discussion préliminaire a été menée sur certaines des fonctions réelles que les gens rencontrent souvent, telles que la barre de progression, la transmission continue à point d'arrêt, la cartographie du réseau interne et externe FTP, etc. Il s'agit de l'application de base de l'auteur sur la base de certaines bibliothèques clients Java FTP. J'espère que ce sera une référence pour les lecteurs. Compléter certaines de ces questions inachevées. Il existe également certains contenus qui sont relativement faciles et ont des descriptions ou des exemples en ligne qui ne sont pas répertoriés ici. Par exemple, comment FTP peut établir des services FTP sur le logiciel Serv-U côté serveur, comment les applets sont intégrés dans les pages JSP et les méthodes de livraison des paramètres, et comment les applets sont démarrés sous Eclipse ou Netbeans, en raison des limites de l'espace, il n'y a pas de description détaillée. Veuillez vous référer aux exemples ou à d'autres documents de référence sur Internet.
Adresse de téléchargement: http://xiazai.vevb.com/201608/yuanma/ftptransfer(vevb.com ).rar
Remarque: Compte tenu du problème du droit d'auteur, le fichier de classe Java n'a pas été envoyé, mais je pense que tout le monde connaît déjà la façon de restaurer un tel fichier JAR dans un fichier Java, haha.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.