Java Applet und FTP

Hallo,

ich habe eine Java Programm geschrieben, mit dem ich eine Datei per FTP herunterladen kann. Das Programm funktioniert auch einwandfrei.
Hier der Code:

import org.apache.commons.net.ftp.*;
import java.io.*;

public class Net {
public static void main(String[] args) {
try {
FTP ftp = new FTP(host,user,pwd);
ftp.cwdi("/tmp");
ftp.receiveFile(„bla.txt“,"/tmp");
ftp.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
class FTP extends FTPClient {
private FTPClient ftp;
public FTP (String host, String userName, String password) {
try {
ftp = new FTPClient();
ftp.connect(host, 21);
ftp.login(userName, password);
} catch (Exception ex) {
ex.printStackTrace();
}
}

public boolean receiveFile (String serverFile, String localDir) {
try {
FTPFile files[] = ftp.listFiles();

if (files != null) {
for (int i=0; i

Moien

Du musst in die jar des Applet die hier benutzten Klassen:

import org.apache.commons.net.ftp.*;

mit einkompilieren/kopieren. Wenn nicht weiss die JVM nicht was diese Zeilen bedeuten:

:FTP ftp = new FTP(host,user,pwd);

Und beschwert sich mit der Fehlermeldung:

java.lang.NoClassDefFoundError: /org/apache/commons/net/ftp/FTPClient

cu

Hallo,

vielen Dank für deine schnelle Antwort.

In meiner Datei Test.java stehen folgende Klassen, die importiert werden:
import java.applet.Applet;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.*;
import java.io.*;

Hast du das gemeint?
Beim Kompilieren bekomme ich keine Fehler. Der Fehler kommt erst beim Ausführen der Test.class im Browser.
Ohne die Zeile
FTP ftp = new FTP(host,user,pwd);
funktioniert das Applet einwandfrei.

Ansonsten weiß ich nicht, wo ich die Klasse FTPClient hinkopieren sollte. Ich beschäftige mich erst seit einer Woche mit Java.

Viele Grüße

Mike

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moien

In meiner Datei Test.java stehen folgende Klassen, die
importiert werden:
import java.applet.Applet;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;

die fangen alle mit java. an und sind an sich in jeder JVM vorhanden. Bei denen muss man nix extra tun.

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.*;

Die 2 sind nicht in allen JVMs enthalten. D.h. eine normale JVM weiss nicht was das ist, was es tut und wieso es gebraucht wird.

Du (oder dein Entwickelungstool) hast diese Zusatzklassen irgendwo runtergeladen und installiert. Meistens als .jar-Datei, meistens in einem Unterverzeichniss des Entwickelungstools oder evtl. auch im Quellcode-verzeichniss deines Projekts.

Diese Dateien fehlen dem Applet. Die JVM des Applet beschränkt sich auf bekannte Klassen (java. und javax. plus ein paar Ausnahmen). Alles weitere muss in der jar-Datei des Applet enthalten sein.

D.h. du suchst jetzt diese Zusatzklassen (eine Datei heist mit Sicherheit FTPClient.java) und packst die mit ins Applet-jar. (jar sind nix anders als zip-Dateien mit einem komischen Namen)

cu

Hi,

das hat funktioniert. Vielen Dank für deine ausführliche Erklärung. Ich bin schon weiter gekommen. Ich habe die Klassen aus import org.apache.commons.net.ftp.*; in die Datei rt.jar kopiert. Das scheint funktioniert zu haben. Doch nun habe ich ein anderes Problem.

Ich habe in meinem Applet in der Funktion init() den Befehl
FTP ftp = new FTP(„123.45.67.89“,user,pwd);
hineingeschrieben. Jetzt startet das Applet, doch ich bekomme folgende Fehlermeldung:
java.security.AccessControlException: access denied (java.net.SocketPermission 123.45.67.89:21 connect, resolve)

Wenn ich meine Klasse „Net“ ohne das Applet in einer anderen Datei ausführe, bekomme ich keine Fehlermeldungen.

Hast du da noch eine Idee?

Viele Grüße

Mike

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo

Ich habe in meinem Applet in der Funktion init() den Befehl
FTP ftp = new FTP(„123.45.67.89“,user,pwd);
hineingeschrieben. Jetzt startet das Applet, doch ich bekomme
folgende Fehlermeldung:
java.security.AccessControlException: access denied
(java.net.SocketPermission 123.45.67.89:21 connect, resolve)

Ein Applet darf sich per Default nur mit dem Server verbinden, von dem es geladen wurde. Wenn das Applet sich mit einem anderen Server verbinden soll, benötigt es zusätzliche Rechte. Das geht nur mit einem signierten Applet.

Gruss,
Andreas

Moien

das hat funktioniert. Vielen Dank für deine ausführliche
Erklärung. Ich bin schon weiter gekommen. Ich habe die Klassen
aus import org.apache.commons.net.ftp.*; in die Datei
rt.jar kopiert. Das scheint funktioniert zu haben.

Du erschlägst ein Problem mit einem anderen. Wenn du das Applet in’s Netz stellst kommen die Leute nicht an dein rt.jar ran. Die Dateien müssen zum Applet, nicht zur JVM.

Ich habe in meinem Applet in der Funktion init() den Befehl
FTP ftp = new FTP(„123.45.67.89“,user,pwd);
hineingeschrieben. Jetzt startet das Applet, doch ich bekomme
folgende Fehlermeldung:
java.security.AccessControlException: access denied
(java.net.SocketPermission 123.45.67.89:21 connect, resolve)

Wenn ich meine Klasse „Net“ ohne das Applet in einer anderen
Datei ausführe, bekomme ich keine Fehlermeldungen.

Hast du da noch eine Idee?

Schreib kein Applet, schreib eine Application. Sobald du mehr als nur Anzeigen von Zeug und ein bisschen Interaktion brauchst sind Applets fehl am Platz. Man kann nur auf den Server zugreiffen von dem das Applet stammt. Wenn möglich kopier die ftp-Dateien auf den Server auf dem das Applet liegt.

cu