FTP FTP Libaries

Diskutiere FTP Libaries im Netzwerkprogrammierung Bereich.
F

FawKes100

Hallo einmal zusammen!
Ich bin seit geraumer Zeit damit beschäftigt eine Datei per FTP an einen Server zu schicken.
Es wird überprüft, ob die Datei seit dem letzten Durchgang aktualisiert wurde, also ihren Wert von "lastmodified()" geändert hat. Ist dieses der Fall, so soll die Datei per FTP an einen Server geschickt werden.
Nun habe ich ein bisschen gegoogelt und feststellen müssen, dass die meisten Leute mit der Bibliothek von Apache arbeiten. Diese habe ich mir dann auch mal runtergeladen und in meiner Programmierumgebung (IntelliJ) hinzugefügt. Nun ist es allerdings der Fall, dass wenn ich nach dem Beispiel gehe des FTPClients, der bereits auf der Seite angezeig bekomme, die Imports der Klassen von Apache nicht funktionieren. Demnach fehlen dort die Klassen, bzw. das komplette Package "net" fehlt - das hab ich raus gefunden, als ich die Jar entpackt habe.

Hat vielleicht jemand Ideen, wie dieses Problem behoben werden können und die Datei an den Server verschickt werden kann?
 
mrBrown

mrBrown

Nun ist es allerdings der Fall, dass wenn ich nach dem Beispiel gehe des FTPClients, der bereits auf der Seite angezeig bekomme, die Imports der Klassen von Apache nicht funktionieren. Demnach fehlen dort die Klassen, bzw. das komplette Package "net" fehlt - das hab ich raus gefunden, als ich die Jar entpackt habe.
Bis zu diesem Absatz habe ich alles verstanden, ab da nicht mehr wirklich...

In Intellij bekommst du die Klassen aus der hinzugefügten Lib nicht zum Import angeboten?
Und in der importieren Lib sind diese auch nicht vorhanden, sondern fehlen?
Dann hast du entweder das falsche geladen, oder dies falsch importiert.

Was meinst du mit FTPClients was auf irgendeiner Seiter angezeigt wird?
 
F

FawKes100

Hallo,

vielen Dank für deine schnelle Antwort.
Ich habe versucht die Imports der Klassen (sowie im Beispiel angegeben) einzufügen.
Zum Beispiel:
Java:
import org.apache.commons.net.PrintCommandListener;
Nun wird das "net" in roter Farbe dargestellt, was soviel bedeutet, dass ein Fehler bei diesem import vorliegt. Fährt man mit der Maus drüber, schreibt er "Cannot resolve symbol 'net'". Alles andere bei dem import wird aber als grau (also als nicht benutzt angezeigt).

Ich habe diese .jar unter Project Structure -> Libaries hinzugefügt. Heruntergeladen habe ich diese von folgender Seite: https://commons.apache.org/proper/commons-net/download_net.cgi

Gibt es vielleicht andere Bibliotheken um zu realisieren, eine Datei auf einen Server hochzuladen? Manuell mache ich das über FileZilla, also einem FTPClient, daher bin ich davon ausgegangen, dass das über FTP recht einfach zu realisieren sein sollte.
 
mrBrown

mrBrown

Nun wird das "net" in roter Farbe dargestellt, was soviel bedeutet, dass ein Fehler bei diesem import vorliegt. Fährt man mit der Maus drüber, schreibt er "Cannot resolve symbol 'net'". Alles andere bei dem import wird aber als grau (also als nicht benutzt angezeigt).

Ich habe diese .jar unter Project Structure -> Libaries hinzugefügt. Heruntergeladen habe ich diese von folgender Seite: https://commons.apache.org/proper/commons-net/download_net.cgi
Dann ist die jar nicht richtig in IntelliJ importiert (oder du hast aus versehen die falsche genommen).
Die dort in der zip-Dateien enthaltene "commons-net-3.6.jar" enthält die entsprechenden Klassen.


Ich würde dir für sowas aber gleich Maven oder Gradle empfehlen, die kümmern sich um die Abhängigkeiten.
 
F

FawKes100

Vielen Dank für die schnelle Antwort.

Habe nun wohl die richtige Datei importieren lassen, sodass jetzt alle Klassen da sind.
Hab jetzt soweit folgenden Code zusammen gebastelt:

Java:
package FTP;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;

public class FTPUploader
{
        FTPClient ftp = null;

        public FTPUploader(String host, String user, String pwd) throws Exception
        {
            ftp = new FTPClient();
            ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
            int reply;
            ftp.connect(host);
            reply = ftp.getReplyCode();
            if(FTPReply.isPositiveCompletion(reply))
            {
                ftp.disconnect();
                throw new Exception("Exception in connecting to FTP-Server");
            }
            ftp.login(user, pwd);
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();
        }

        public void uploadFile(String localFileFullName, String fileName, String hostDir) throws Exception
        {
            try(InputStream input = new FileInputStream(new File(localFileFullName)))
            {
                this.ftp.storeFile(hostDir + fileName, input);
            }
        }

        public void disconnect()
        {
            if(this.ftp.isConnected())
            {
                try
                {
                    this.ftp.logout();
                    this.ftp.disconnect();
                }catch(IOException e)
                {

                }
            }
        }
}
Wenn ich nun das ganze ausführen lasse, erhalte ich eine java.net.ConnectException: Connection refused: connect

Das ganze wird ausgerufen wenn ich die Methode ftp.connect(host) ausführe...
 
F

FawKes100

Soweit ich weiß nicht - was ich bereits vermutet hatte als ich nach der Fehlermeldung gegoogelt habe.
Allerdings bekomme ich über FileZilla eine Verbindung hin, weshalb ich dachte, dass das nicht das Problem sein kann...
Bedeutet dass das ich noch nen Server-Teil programmieren muss?
 
looparda

looparda

Soweit ich weiß nicht
Allerdings bekomme ich über FileZilla eine Verbindung hin
Was denn nun?

Wenn du per FileZilla auf den FTP-Server kommst läuft bereits der FTP-Server-Teil. Du kannst über den Port mit dem richtigen Protokoll (FTP) mit dem Server kommunizieren. Du musst also nur den Client-Code schreiben.
Woran es nun liegt, dass du per Client-Code nicht drauf kommst ist schwer zu sagen ohne den Aufbau zu kennen. Du könntest als erstes prüfen ob der Port in deinem Programm stimmt.
 
F

FawKes100

Wenn ich FileZilla benutze um auf den Server zu verbinden nutze ich Port 22. Wenn ich in meinem selbst programmierten Client 22 benutze erhalte ich keine Rückmeldung - ich vermute mal, dass das an dem fehlenden zertifikat liegt, da 22 ja für sftp benutzt wird. Bei Port 20 und 21 erhalte ich den oben genannten Fehlercode.
 
F

FawKes100

Hmmh - dann wird das wohl das Problem sein, dass FileZilla per SFTP auf den Server verbindet über Port 22.

Denn wenn ich in FileZilla sage, er solle doch bitte Port 20 oder 21 benutzen, bekomme ich ebenfalls ne Fehlermeldung: "Verbindungsversuch fehlgeschlagen mit "ECONNREFUSED - Verbindung durch Server verweigert".

Das bedeutet wohl dass auf dem Server ein SFTP Server läuft aber kein FTP - hab ich das so richtig verstanden?
Das würde dann wohl bedeuten, dass ich auf dem Server entweder ein FTP-Server brauche oder aber meinen Client-Code auf SFTP umrüsten muss, wenn ich das richtig verstanden habe?
 
looparda

looparda

Hmmh - dann wird das wohl das Problem sein, dass FileZilla per SFTP auf den Server verbindet über Port 22.

Denn wenn ich in FileZilla sage, er solle doch bitte Port 20 oder 21 benutzen, bekomme ich ebenfalls ne Fehlermeldung: "Verbindungsversuch fehlgeschlagen mit "ECONNREFUSED - Verbindung durch Server verweigert".

Das bedeutet wohl dass auf dem Server ein SFTP Server läuft aber kein FTP - hab ich das so richtig verstanden?
Das würde dann wohl bedeuten, dass ich auf dem Server entweder ein FTP-Server brauche oder aber meinen Client-Code auf SFTP umrüsten muss, wenn ich das richtig verstanden habe?
Korrekt. Ich würde einfach eine SFTP Library suchen und benutzen.
 
F

FawKes100

Hab meinen Code jetzt angepasst. Die Libary die ich nutze unterstützt auch FTPS - ist das dasselbe wie SFTP?

habe das jetzt mal einfach an FTPS angepasst nun erzeuge ich kein Objekt mehr vom FTPClient sondern vom FTPSClient.

Als Error erhalte ich nun, wenn ich versuche zum Server zu connecten folgenden:

Code:
org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
Server Reply: SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u4

    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:344)
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:300)
    at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:438)
    at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:962)
    at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:950)
    at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:222)
    at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
    at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
    at FTP.FTPUploader.<init>(FTPUploader.java:19)
    at core.Main.main(Main.java:19)
Ist das zufällig die SSL Exception, von der du gesprochen hast? Wenn ja, wie kann ich diesen Fehler beheben?
 
F

FawKes100

Aber ich bekomme anscheinend nun eine Verbindung zum Server. Hat evtl jemand eine Idee, wie ich den Fehler oben beheben kann?
 
looparda

looparda

org.apache.commons.net.MalformedServerReplyException: Could not parse response code.
Deutet darauf hin, dass die Response im Protokoll welches gelesen wird (SFTP) versucht wird als FTPS Response zu lesen. Das klappt nicht, da das Protokoll halt verschieden ist.
Das bedeutet wohl dass auf dem Server ein SFTP Server läuft aber kein FTP - hab ich das so richtig verstanden?
Das würde dann wohl bedeuten, dass ich auf dem Server entweder ein FTP-Server brauche oder aber meinen Client-Code auf SFTP umrüsten muss, wenn ich das richtig verstanden habe?
 
F

FawKes100

Ich habe jetzt mal versucht nen SFTP Uploader zu basteln. Habe dazu die Libary "Jsch" gefunden - keine Ahnung ob die wem was sagt.. So sieht der Code nun aus zum verbinden auf den Server:

Java:
  public void connect(String host, int port, String user, String pwd, int timeout)
    {
        this.jsch = new JSch();
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        this.jsch.setConfig(config);

        try {
            session = this.jsch.getSession(user, host, port);
            session.setPassword(pwd);
            session.connect(timeout);

            channel = session.openChannel("sftp");
            channel.connect();
        } catch (JSchException e) {
            e.printStackTrace();
        }

    }
Allerdings erhalte ich noch den selben StackTrace wie zuvor... Kann mir ansonsten vielleicht jemand eine Library empfehlen mit der man einen SFTP Client realisieren kann?

Was mir noch aufgefallen ist: Es dauert immer ziemlich lage, bis mir der Stacktrace in der Konsole ausgegeben wird..

Es kann doch wohl nicht so schwer sein eine Klasse zu schreiben mit der man eine Verbindung zum Server herstellen kann und eine Datei auf diesen laden kann?
 
mihe7

mihe7

Ich habe das mit JSch und dem SFtpWrapper von der verlinkten Seite probiert: funktioniert auf Anhieb einwandfrei.

Code:
public class Test {
    public static void main(String[] args) throws Exception {
       try(SFtpWrapper wrapper = new SFtpWrapper("benutzer", "passwort", "localhost", 22)) {
           wrapper.uploadFile("Test.class", "Test.class");
       }
    }
}
 
Thema: 

FTP Libaries

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben