Also ein Tropfen Theorie
FTP (File Transfer Protocol) ist ein Netzwerk-Dateiübertragungsprotokoll.
Für FTP sind zwei erforderlich: ein FTP-Server und ein FTP-Client.
Der Server bietet Zugriff per Login und Passwort auf die erforderlichen Dateien und zeigt dem Benutzer dementsprechend nur die Dateien und Ordner an, auf die er Zugriff hat.
Client ist ein Programm für die FTP-Verbindung. Die Hauptidee ist, dass der Benutzer die Dateidaten auf der Serverseite bearbeiten kann: Anzeigen, Bearbeiten, Kopieren, Herunterladen und Löschen.
Alles ist logisch.
Im Gegensatz zu beispielsweise demselben HTTP verwendet FTP eine doppelte Verbindung als Verbindungsmodell. In diesem Fall ist ein Kanal der Steuerkanal, über den Befehle an den Server empfangen und dessen Antworten zurückgegeben werden (normalerweise über TCP-Port 21), und über den Rest findet die eigentliche Datenübertragung statt, ein Kanal für jede Übertragung. Daher können im Rahmen einer Sitzung über das FTP-Protokoll mehrere Dateien gleichzeitig und in beide Richtungen übertragen werden.
Wenn Sie den Prozess des Verbindungsaufbaus und der weiteren Datenübertragung Punkt für Punkt beschreiben, erhalten Sie ungefähr Folgendes:
- Der Benutzer aktiviert die Clientanwendung und stellt durch Eingabe eines Benutzernamens und eines Kennworts eine Verbindung zum Server her.
- — .
- , FTP- ( , FTP — , , ), , (, , , ..).
- ( , ), , FPT — , .
. - Nach Abschluss der Übertragung wird diese Verbindung geschlossen, aber der Steuerkanal zwischen den Dolmetschern bleibt offen, wodurch der Benutzer die Datenübertragung innerhalb derselben Sitzung erneut öffnen kann.
FTP - Die Standardverbindung ist Port 21, sofern kein anderer Port festgelegt ist.
Implementierung
In diesem Fall verwenden wir die FTPClient-Klasse aus der Apache-Bibliothek (org.apache.commons.net.ftp.FTPClient). Wir erstellen ein Objekt der Klasse und legen eine Zeitüberschreitung fest. Dann müssen wir zuerst eine Verbindung zum Server herstellen, bevor wir etwas tun (und denken Sie daran, die Verbindung zu trennen, nachdem wir fertig sind). In connect schreiben wir als ersten Parameter die lokale Adresse des Hosts, das zweite Argument ist der Port für die Verbindung. Sie müssen auch den FTP-Antwortcode überprüfen (zu offensichtlich, aber immer noch), um sicherzustellen, dass die Verbindung erfolgreich war.
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, wir sind mit dem Server verbunden. Was weiter? Jetzt müssen Sie die Autorisierung unter dem Benutzernamen durchlaufen, den wir tatsächlich dafür erstellt haben. Zuvor müssen Sie jedoch den aktuellen Datenverbindungsmodus mit dem Befehl enterLocalPassiveMode () auf PASSIVE_LOCAL_DATA_CONNECTION_MODE setzen. Dies bedeutet, dass alle Übertragungen zwischen dem Client und dem Server stattfinden und dass sich der Server im passiven Modus befindet und darauf wartet, dass der Client eine Verbindung herstellt, um die Übertragung zu initiieren. (ACTIVE_LOCAL_DATA_CONNECTION_MODE impliziert beispielsweise, dass der Server die Verbindung initiiert.)
Danach schreiben Sie beim Login den Benutzernamen und das Passwort. storeFile () speichert die Datei auf dem Server unter dem angegebenen Namen und akzeptiert Eingaben vom angegebenen InputStream. Ich hatte die Aufgabe, regelmäßig in eine bestimmte Datei auf dem Server zu schreiben. Es sieht also so aus:
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()
}
Wenn Sie Ihre Datei vollständig auf den Server kopieren möchten, können Sie dies tun (das Wesentliche ändert sich nicht viel, aber plötzlich braucht es jemand):
val file = File(" ")
val msg_bytes = FileInputStream(file)
Alles in allem ist dies alles, was Sie brauchen könnten. Und natürlich ein wenig über das Einrichten eines lokalen FTP-Servers. Ich habe dies, wie ich zuvor geschrieben habe, FileZilla. Wir lassen standardmäßig alles. Erstellen Sie einen Benutzer und weisen Sie ihm einen Ordner auf dem Host zu, aus dem er lesen / schreiben / löschen usw. kann.
Das ist alles. Starten Sie die Protokolle auf dem Server und zeigen Sie sie an. Und hier ist was Sie bekommen sollten:
Viel Glück!