-
10.2.4.3 Exemple 3 : Développement de protocoles de couche application réseau
Tsinghua University Press « Programmeurs Java, choses à faire au travail » auteur : Zhong Sheng - Extraits partiels du chapitre 10 « Un maître est aussi talentueux que capable ».
Tout le monde a peut-être utilisé des outils de téléchargement et de téléchargement FTP. Par exemple, « LeapFTP » est un outil de téléchargement et de téléchargement sur serveur FTP très pratique, comme le montre la figure. Cet outil est très pratique. Après avoir saisi le nom d'utilisateur et le mot de passe, vous pouvez voir la liste des fichiers sur le serveur FTP, ce qui facilite les opérations de chargement et de téléchargement.
Avez-vous déjà essayé d'écrire une application de téléchargement et de téléchargement de fichiers FTP en Java ?
Java peut également développer un tel programme. Ce n'est pas compliqué. Voyons d'abord comment développer une application FTP à l'aide de la boîte à outils FTP de Java.
importer sun.net.* ;
importer sun.net.ftp.* ;
classe publique FTP {
public static void main (String[] arguments) {
String server="192.168.0.12"; //Saisir l'adresse IP du serveur FTP
String user="useway"; //Nom d'utilisateur pour se connecter au serveur FTP
String password=" !@#$%abce "; //Mot de passe du nom d'utilisateur pour se connecter au serveur FTP
String path="/home/useway"; //Le chemin sur le serveur FTP
essayer {
FtpClient ftpClient=new FtpClient(); //Créer un objet FtpClient
ftpClient.openServer(server); //Se connecter au serveur FTP
ftpClient.login(utilisateur, mot de passe); //Connectez-vous au serveur FTP
if (path.length()!=0) ftpClient.cd(path);
TelnetInputStream is=ftpClient.list();
int c;
tandis que ((c=is.read())!=-1) {
System.out.print((char)c);
}
est.close();
ftpClient.closeServer();//Quitter le serveur FTP
}
catch(Exception ex){
}
}
}
Si vous êtes intéressé, vous pouvez écrire ce programme vous-même. Lorsque ce programme sera exécuté, nous verrons la situation comme le montre la figure, répertoriant le contenu du répertoire du programme côté serveur.
Ce programme est un programme simple pour obtenir la liste des fichiers sur le serveur FTP, mais ne vous méprenez pas, ce programme ne peut pas être appelé le développement d'un programme "Network Application Layer Protocol" !
Ce programme utilise uniquement les classes associées dans "sun.net.*;" et "sun.net.ftp.*;" pour faire fonctionner le côté FTP. Nous n'utilisons pas le Socket de Java au niveau du réseau pour faire face au serveur FTP. La demande est envoyée au client, mais une demande de lien est envoyée au serveur via la boîte à outils fournie par Java.
L'avantage d'utiliser le package FTP de Java pour se connecter au serveur FTP est que nous n'avons pas besoin de nous soucier des détails spécifiques de l'envoi de données au niveau du réseau, mais seulement d'appeler la méthode correspondante. L'inconvénient de l'utilisation du package FTP de Java pour se connecter au serveur FTP est que les développeurs ne connaissent pas les tenants et les aboutissants de l'envoi et de la réception du protocole de couche application, ne peuvent pas comprendre les principes et ont une très faible compréhension des données sous-jacentes.
À ce stade, certains programmeurs demanderont : « Alors, comment FTP interagit-il entre le PC et le serveur au niveau du réseau ? » Eh bien, laissez-moi vous énumérer le processus d'interaction du protocole FTP.
Veuillez regarder l'exemple suivant d'interaction avec le protocole FTP :
Serveurs FTP : 220 (vs FTPd 2.0.1)
Client FTP : mode d'utilisation UTILISATEUR
Serveur FTP : 331 Veuillez préciser le mot de passe.
Client FTP : PASS !@#$%abce
Serveur FTP : 230 Connexion réussie.
Client FTP : CWD /home/useway
Serveur FTP : 250 Répertoire modifié avec succès.
Client FTP : EPSV TOUS
Serveur FTP : 200 EPSV TOUT ok.
Client FTP : EPSV
Serveur FTP : 229 Entrée en mode passif étendu (|||62501|)
Client FTP : LISTE
Serveur FTP : 150 Voici la liste du répertoire.
Serveur FTP : 226 Envoi répertoire OK.
Client FTP : QUITTER
Serveur FTP : 221 Au revoir.
Le texte ci-dessus est en fait le processus d'interaction entre le serveur FTP et le client FTP. Le protocole de transmission des informations entre eux est le protocole TCP, et le contenu échangé est ce qui est écrit dans le texte ci-dessus.
Expliquons le sens de chaque phrase étape par étape :
Serveur FTP : 220 (vsFTPd 2.0.1) Description : Lien réussi
Client FTP : Mode d'utilisation UTILISATEUR | Instructions : Entrez le nom d'utilisateur
Serveur FTP : 331 Veuillez spécifier le mot de passe |Description : Veuillez saisir le mot de passe.
Client FTP : PASS !@#$%abce |Instructions : Entrez le mot de passe
Serveur FTP : 230 Connexion réussie | Description : Connexion réussie.
Client FTP : CWD /home/useway Description : Changer de répertoire
Serveur FTP : 250 Répertoire modifié avec succès |Description : Le changement de répertoire a réussi.
Client FTP : EPSV ALL Description : Mode liaison passive EPSV
Serveur FTP : 200 EPSV TOUT ok | Description : OK.
Client FTP : EPSV | Description : Lien
Serveur FTP : 229 Entrée en mode passif étendu (|||62501|) |Description : Le port de liaison passive est 62501
Client FTP : LIST | Description : Exécutez LIST pour afficher la liste des fichiers.
Serveur FTP : 150 Voici la liste du répertoire | Description : La liste est envoyée depuis le port 62501.
Serveur FTP : 226 Envoi répertoire OK |Description : Envoi terminé.
Client FTP : QUITTER | Description : Quitter FTP
Serveur FTP : 221 Au revoir | Description : Au revoir.
Avec le contenu du texte ci-dessus, nous pouvons obtenir la liste des fichiers FTP sans aucun outil. Si vous n'y croyez pas, suivez-moi et recommencez.
Étape 1 : Ouvrez d’abord CMD pour accéder au mode ligne de commande DOS et tapez :
telnet 192.168.0.1 21[Entrer]
Description : Telnet au port 21 du serveur FTP.
Après avoir exécuté cette commande, les résultats obtenus sont tels qu'indiqués sur la figure.
Avez-vous rencontré des problèmes ?
Le contenu de l'invite est exactement la première phrase du paragraphe ci-dessus : 220 (vsFTPd 2.0.1), ce qui signifie que le serveur FTP a accepté notre lien et peut passer à l'étape suivante.
Étape 2 : Tapez la série suivante de contenus d’envoi un par un :
Voie UTILISATEUR[Entrer]
PASSER !@#$%abce [Entrer]
CWD /home/useway[Entrer]
EPSV TOUS[Entrer]
EPSV[Entrer]
Les résultats obtenus sont présentés sur la figure.
Eh bien, cette fois, le serveur FTP a donné une série de réponses, et a finalement donné un nouveau numéro de port "58143".
Étape 3 : Ouvrez une nouvelle fenêtre CMD et tapez :
telnet 192.168.0.1 58143[Entrer]
Notez que le numéro de port de la requête Telnet pour se connecter au serveur cette fois est "58143", qui est un port de liaison qui nous est fourni par le serveur FTP. Après la liaison, la fenêtre est vide sans aucune invite, comme le montre la figure.
Étape 4 : Revenez à la première fenêtre CMD et tapez :
LISTE[Entrer]
Étape 5 : A ce moment, la deuxième fenêtre CMD reçoit la liste des fichiers :
La deuxième fenêtre reçoit la liste des fichiers comme indiqué sur la figure.
Étape 6 : Quitter l'opération
QUITTER[Entrer]
Une fois l'exécution terminée, le lien vers l'hôte est perdu, comme le montre la figure.
Comme vous pouvez le constater, le protocole FTP est un processus très interactif. Vous pouvez également effectuer ces opérations de commande de base de FTP en utilisant l'outil Telnet fourni avec le système. Si vous souhaitez utiliser Socket de Java pour effectuer l'opération ci-dessus, il vous suffit de suivre le contenu ci-dessus étape par étape pour envoyer la chaîne au serveur FTP.
Nous donnons également un exemple de code ci-dessous :
importer java.io.InputStream ;
importer java.io.OutputStream ;
importer java.net.Socket ;
classe publique FTPClient{
public static void main(String[] args) lève une exception{
Socket socket = nouveau Socket("192.168.0.1",21);
InputStream est = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//Recevoir les informations initiales du lien
octet[] tampon = nouvel octet[100];
int longueur = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//Envoyer le nom d'utilisateur
String str = "Utilisation UTILISATEURn" ;
os.write(str.getBytes());
//Obtenir la valeur de retour
longueur = is.read(tampon);
s = new String (tampon, 0, longueur);
System.out.println(s);
//Envoyer le mot de passe
str = "PASS !@#$%abcdn ";
os.write(str.getBytes());
//Obtenir la valeur de retour
longueur = is.read(tampon);
s = new String (tampon, 0, longueur);
System.out.println(s);
//Envoyer la commande de changement de dossier
str = "CWD /home/usewayn";
os.write(str.getBytes());
//Obtenir la valeur de retour
longueur = is.read(tampon);
s = new String (tampon, 0, longueur);
System.out.println(s);
//Définir le mode
str = "EPSV TOUTn" ;
os.write(str.getBytes());
//Obtenir la valeur de retour
longueur = is.read(tampon);
s = new String (tampon, 0, longueur);
System.out.println(s);
//Obtenir des informations de surveillance passive
str = "EPSVn" ;
os.write(str.getBytes());
//Obtenir la valeur de retour
longueur = is.read(tampon);
s = new String (tampon, 0, longueur);
System.out.println(s);
//Obtenir le numéro de port pour la surveillance passive FTP
Chaîne portlist=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(liste de ports);
//Instancier la classe de thread ShowList et lier le numéro de port d'écoute passive FTP
ShowList sl=nouveau ShowList();
sl.port=Integer.parseInt(liste de ports);
sl.start();
//Exécuter la commande LISTE
str = "LISTEn" ;
os.write(str.getBytes());
//Obtenir la valeur de retour
longueur = is.read(tampon);
s = new String (tampon, 0, longueur);
System.out.println(s);
//Ferme le lien
est.close();
os.close();
socket.close();
}
}
//Obtenir la classe d'informations de lien passif, cette classe est multithread
la classe ShowList étend Thread{
port international public = 0 ;
public void run(){
essayer{
Socket socket = nouveau Socket("192.168.0.1",this.port);
InputStream est = socket.getInputStream();
OutputStream os = socket.getOutputStream();
octet[] tampon = nouvel octet[10000] ;
int longueur = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//Ferme le lien
est.close();
os.close();
socket.close();
}
catch(Exception ex){
}
}
}
Le résultat d'exécution obtenu après l'exécution du programme est celui indiqué dans la figure. C'est fondamentalement le même que l'effet d'exécution ci-dessus. Qu'en est-il de la couche inférieure ? Ce n'est rien de plus que de décompresser les méthodes encapsulées et de les exécuter. les règles de leur fonctionnement, nous pouvons Le même programme peut être développé.