-
10.2.4.3 Beispiel 3: Entwicklung von Protokollen der Netzwerkanwendungsschicht
Tsinghua University Press „Java Programmers, Things to Do at Work“ Autor: Zhong Sheng – Teilauszüge aus Kapitel 10 „Ein Meister ist so talentiert, wie er fähig ist“.
Jeder hat möglicherweise FTP-Upload- und Download-Tools verwendet. „LeapFTP“ ist beispielsweise ein sehr praktisches FTP-Server-Upload- und Download-Tool, wie in der Abbildung gezeigt. Dieses Tool ist sehr praktisch. Nach Eingabe des Benutzernamens und Passworts können Sie die Dateiliste auf dem FTP-Server sehen, was den Upload- und Download-Vorgang erleichtert.
Haben Sie schon einmal versucht, eine Anwendung zum Hoch- und Herunterladen von FTP-Dateien in Java zu schreiben?
Auch Java kann ein solches Programm entwickeln. Schauen wir uns zunächst an, wie man eine FTP-Anwendung mit dem FTP-Toolkit entwickelt.
sun.net importieren.*;
import sun.net.ftp.*;
öffentliche Klasse FTP {
public static void main(String[] args) {
String server="192.168.0.12"; //Geben Sie die IP-Adresse des FTP-Servers ein
String user="useway"; //Benutzername zum Anmelden beim FTP-Server
String password=" !@#$%abce "; //Passwort des Benutzernamens für die Anmeldung beim FTP-Server
String path="/home/useway"; //Der Pfad auf dem FTP-Server
versuchen {
FtpClient ftpClient=new FtpClient(); //FtpClient-Objekt erstellen
ftpClient.openServer(server); //Mit FTP-Server verbinden
ftpClient.login(Benutzer, Passwort); //Melden Sie sich beim FTP-Server an
if (path.length()!=0) ftpClient.cd(path);
TelnetInputStream is=ftpClient.list();
int c;
while ((c=is.read())!=-1) {
System.out.print((char)c);
}
is.close();
ftpClient.closeServer();//FTP-Server verlassen
}
Catch(Ausnahme ex){
}
}
}
Wenn Sie interessiert sind, können Sie dieses Programm selbst schreiben. Wenn dieses Programm ausgeführt wird, sehen wir die in der Abbildung gezeigte Situation und listen den Verzeichnisinhalt des serverseitigen Programms auf.
Dieses Programm ist ein einfaches Programm zum Abrufen der Dateiliste auf dem FTP-Server, aber verstehen Sie mich nicht falsch, dieses Programm kann nicht als Entwicklung eines „Network Application Layer Protocol“-Programms bezeichnet werden!
Dieses Programm verwendet nur die zugehörigen Klassen in „sun.net.*;“, um die FTP-Seite zu betreiben. Wir verwenden nicht den Socket von Java, um den FTP-Server zu bedienen Die Anfrage wird an den Client gesendet, aber eine Link-Anfrage wird über das von Java bereitgestellte Toolkit an den Server gesendet.
Der Vorteil der Verwendung des FTP-Pakets von Java zum Herstellen einer Verbindung zum FTP-Server besteht darin, dass wir uns nicht um die spezifischen Details des Sendens von Daten auf Netzwerkebene kümmern müssen, sondern nur die entsprechende Methode aufrufen müssen. Der Nachteil der Verwendung des FTP-Pakets von Java zum Herstellen einer Verbindung zum FTP-Server besteht darin, dass Entwickler die Besonderheiten des Sendens und Empfangens von Protokollen der Anwendungsschicht nicht kennen, die Prinzipien nicht verstehen können und nur ein sehr schwaches Verständnis für die zugrunde liegenden Daten haben.
An dieser Stelle werden einige Programmierer fragen: „Wie interagiert FTP zwischen dem PC und dem Server auf Netzwerkebene?“ Lassen Sie mich den Interaktionsprozess des FTP-Protokolls für Sie auflisten.
Schauen Sie sich bitte das folgende Beispiel einer FTP-Protokollinteraktion an:
FTP-Server: 220 (vsFTPd 2.0.1)
FTP-Client: USER-Nutzung
FTP-Server: 331 Bitte geben Sie das Passwort ein.
FTP-Client: PASS !@#$%abce
FTP-Server: 230 Anmeldung erfolgreich.
FTP-Client: CWD /home/useway
FTP-Server: 250 Verzeichnis erfolgreich geändert.
FTP-Client: EPSV ALL
FTP-Server: 200 EPSV ALLES ok.
FTP-Client: EPSV
FTP-Server: 229 Geht in den erweiterten Passivmodus (|||62501|)
FTP-Client: LISTE
FTP-Server: 150 Hier kommt die Verzeichnisliste.
FTP-Server: 226 Verzeichnis senden OK.
FTP-Client: BEENDEN
FTP-Server: 221 Auf Wiedersehen.
Der obige Text ist eigentlich der Prozess der Interaktion zwischen dem FTP-Server und dem FTP-Client. Das Protokoll zum Übertragen von Informationen zwischen ihnen ist das TCP-Protokoll, und der aneinander gesendete Inhalt ist der im obigen Text geschriebene.
Lassen Sie uns Schritt für Schritt die Bedeutung jedes Satzes erklären:
FTP-Server: 220 (vsFTPd 2.0.1) | Beschreibung: Link erfolgreich
FTP-Client: USER useway |Anleitung: Benutzernamen eingeben
FTP-Server: 331 Bitte geben Sie das Passwort ein. |Beschreibung: Bitte geben Sie das Passwort ein.
FTP-Client: PASS !@#$%abce |Anweisungen: Passwort eingeben
FTP-Server: 230 Anmeldung erfolgreich |.
FTP-Client: CWD /home/useway | Beschreibung: Verzeichnis wechseln
FTP-Server: 250 Verzeichnis erfolgreich geändert. |Beschreibung: Verzeichniswechsel war erfolgreich.
FTP-Client: EPSV ALL |. Beschreibung: Passiver Link-Modus von EPSV
FTP-Server: 200 EPSV ALLE ok |
FTP-Client: EPSV |. Beschreibung: Link
FTP-Server: 229 Geht in den erweiterten Passivmodus (|||62501|) |Beschreibung: Der passive Link-Port ist 62501
FTP-Client: LIST |. Beschreibung: Führen Sie LIST aus, um die Dateiliste anzuzeigen
FTP-Server: 150 Hier kommt die Verzeichnisliste | Beschreibung: Die Liste wird von Port 62501 gesendet
FTP-Server: 226 Verzeichnis senden OK |Beschreibung: Senden abgeschlossen
FTP-Client: QUIT |. Beschreibung: FTP beenden
FTP-Server: 221 Auf Wiedersehen |
Mit dem Inhalt des obigen Textes können wir die FTP-Dateiliste ohne Tools erhalten. Wenn Sie es nicht glauben, folgen Sie mir und wiederholen Sie den Vorgang.
Schritt 1: Öffnen Sie zunächst CMD, um den DOS-Befehlszeilenmodus aufzurufen, und geben Sie Folgendes ein:
Telnet 192.168.0.1 21[Eingabe]
Beschreibung: Telnet zu Port 21 des FTP-Servers.
Nach der Ausführung dieses Befehls werden die in der Abbildung dargestellten Ergebnisse erzielt.
Haben Sie Probleme festgestellt?
Der Inhalt der Eingabeaufforderung entspricht genau dem ersten Satz des obigen Absatzes: 220 (vsFTPd 2.0.1), was bedeutet, dass der FTP-Server unseren Link akzeptiert hat und mit dem nächsten Schritt fortfahren kann.
Schritt 2: Geben Sie nacheinander die folgende Reihe von Sendeinhalten ein:
USER useway[Enter]
PASS !@#$%abce [Enter]
CWD /home/useway[Enter]
EPSV ALLE[Eingabe]
EPSV[Eingabe]
Die erhaltenen Ergebnisse sind in der Abbildung dargestellt.
Nun, dieses Mal gab der FTP-Server eine Reihe von Antworten und gab schließlich eine neue Portnummer „58143“ an.
Schritt 3: Öffnen Sie ein neues CMD-Fenster und geben Sie Folgendes ein:
Telnet 192.168.0.1 58143[Eingabe]
Beachten Sie, dass die Portnummer der Telnet-Anfrage zur Verbindung mit dem Server dieses Mal „58143“ lautet. Dies ist ein Link-Port, der uns vom FTP-Server zugewiesen wurde. Nach der Verknüpfung ist das Fenster leer und enthält keine Eingabeaufforderungen, wie in der Abbildung dargestellt.
Schritt 4: Kehren Sie zum ersten CMD-Fenster zurück und geben Sie Folgendes ein:
LISTE[Eingabe]
Schritt 5: Zu diesem Zeitpunkt empfängt das zweite CMD-Fenster die Dateiliste:
Das zweite Fenster empfängt die Dateiliste wie in der Abbildung gezeigt.
Schritt 6: Beenden Sie den Vorgang
BEENDEN[Eingeben]
Nach Abschluss der Ausführung geht die Verbindung zum Host verloren, wie in der Abbildung dargestellt.
Wie Sie sehen, handelt es sich beim FTP-Protokoll um einen solchen interaktiven Prozess. Sie können diese grundlegenden Befehlsvorgänge von FTP auch mithilfe des mit dem System gelieferten Telnet-Tools ausführen. Wenn Sie Javas Socket verwenden möchten, um den obigen Vorgang abzuschließen, müssen Sie nur den obigen Inhalt Schritt für Schritt befolgen, um die Zeichenfolge an den FTP-Server zu senden.
Nachfolgend geben wir auch Beispielcode an:
import java.io.InputStream;
import java.io.OutputStream;
java.net.Socket importieren;
öffentliche Klasse FTPClient{
public static void main(String[] args) löst eine Ausnahme aus{
Socket socket = new Socket("192.168.0.1",21);
InputStream ist = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//Erste Linkinformationen erhalten
byte[] buffer = neues byte[100];
int length = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//Benutzernamen senden
String str = "USER usewayn";
os.write(str.getBytes());
//Rückgabewert abrufen
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//Passwort senden
str = "PASS !@#$%abcdn ";
os.write(str.getBytes());
//Rückgabewert abrufen
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//Befehl zum Wechseln des Ordners senden
str = "CWD /home/usewayn";
os.write(str.getBytes());
//Rückgabewert abrufen
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//Modus einstellen
str = "EPSV ALLn";
os.write(str.getBytes());
//Rückgabewert abrufen
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//Informationen zur passiven Überwachung abrufen
str = "EPSVn";
os.write(str.getBytes());
//Rückgabewert abrufen
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//Holen Sie sich die Portnummer für die passive FTP-Überwachung
String portlist=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(portlist);
// Instanziieren Sie die ShowList-Thread-Klasse und verknüpfen Sie die Nummer des passiven FTP-Listening-Ports
ShowList sl=new ShowList();
sl.port=Integer.parseInt(portlist);
sl.start();
//LIST-Befehl ausführen
str = "LISTEn";
os.write(str.getBytes());
//Rückgabewert abrufen
length = is.read(buffer);
s = new String(buffer, 0, length);
System.out.println(s);
//Schließe den Link
is.close();
os.close();
socket.close();
}
}
// Holen Sie sich die passive Link-Informationsklasse. Diese Klasse ist multithreaded
Klasse ShowList erweitert Thread{
öffentlicher int-Port=0;
public void run(){
versuchen{
Socket socket = new Socket("192.168.0.1",this.port);
InputStream ist = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte[] buffer = neues byte[10000];
int length = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//Schließe den Link
is.close();
os.close();
socket.close();
}
Catch(Ausnahme ex){
}
}
}
Das nach dem Ausführen des Programms erhaltene Ausführungsergebnis ist im Grunde das gleiche wie der obige Ausführungseffekt. Was ist mit der untersten Ebene? Solange wir es verstehen Durch die Regeln ihrer Funktionsweise können wir das gleiche Programm entwickeln.