# Problem mit commons net



## Garrona (16. Juli 2008)

Hallo habe folgendes Problem mit commons net und kopieren von einem ftp:

Aufgabenstellung: Kopieren von vielen Dateien und Verzeichnissen. Benutze Java mit den Apache.oro und Apache.commons.net Bibliotheken. 

Problem: Bekomme im aktiven Modus des Clients nach ca. 100-200 Dateien folgende Fehlermeldung:

java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(SocketInputStream.java:168)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
	at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:114)
	at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:535)
	at java.lang.Thread.run(Thread.java:619)

Im passiven Modus (dachte es liegt am aktiv) bekomme ich beim Auflisten aller Dateien eines Verzeichnisses folgende Fehlermeldung:

java.net.NoRouteToHostException: No route to host: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
	at java.net.Socket.connect(Socket.java:518)
	at java.net.Socket.connect(Socket.java:468)
	at java.net.Socket.<init>(Socket.java:365)
	at java.net.Socket.<init>(Socket.java:179)
	at org.apache.commons.net.DefaultSocketFactory.createSocket(DefaultSocketFactory.java:53)
	at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:513)
	at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2390)
	at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2364)
	at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2141)
	at FTP.Ftp.downloadDir(Ftp.java:157)
	at FTP.Ftp.<init>(Ftp.java:89)
	at FTP.Ftp.main(Ftp.java:116)

Woran kann das liegen? Programmierfehler oder Problem beim FTP Server? Mit normalen FTP clients funktionierts sowohl im Aktiv als auch im Passiv Modus. 

Hab auch schon probiert nach der Fehlermeldung im Aktiv Modus eine neue Verbindung aufzubauen, und die restlichen Dateien zu kopieren - leider funktioniert dies auch nicht, da die kopierten Dateien 0kb nach dem kopieren besitzen.

Hier der Code des Programms


```
package FTP;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPCommand;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public final class Ftp {

	private String server, username, password, remote, local;

	public Ftp(String args[]) {
		int base = 0;
		boolean binaryTransfer = false, error = false;

		FTPClient ftp;

		remote = "/lib_cs"; // Verzeichnis auf FTP
		local = "C:/ftp/lib_cs"; // Zielverzeichnis

		server = "ftp.test.de";
		username = "testaccount";
		password = "testpassword";

		ftp = new FTPClient();
		
		connect(ftp, server);

		System.out.println("Connected to " + server + ".");

		__main: try {
			if (!ftp.login(username, password)) {
				ftp.logout();
				error = true;
				break __main;
			}

			System.out.println("Remote system is " + ftp.getSystemName());

			// Use passive mode as default because most of us are
			// behind firewalls these days.
//			ftp.enterLocalPassiveMode();
			ftp.enterLocalActiveMode();

			if (binaryTransfer) {
				ftp.setFileType(FTP.BINARY_FILE_TYPE);
			}
			System.out.println(remote + " " + local);
			downloadDir(local, ftp, remote);
			// File file = new File(local);
			// extract(file);
			// file.deleteOnExit();

			ftp.logout();
		} catch (FTPConnectionClosedException e) {
			error = true;
			System.err.println("Server closed connection.");
			e.printStackTrace();
		} catch (IOException e) {
			error = true;
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException f) {
					// do nothing
				}
			}
		}

		System.exit(error ? 1 : 0);
	}

	public static final void main(String[] args) {
		new Ftp(args);
	}

	private void connect(FTPClient ftp, String server) {

		try {
			if (!ftp.isConnected()) {
				int reply;
				ftp.connect(server);

				// After connection attempt, you should check the reply code to verify success
				reply = ftp.getReplyCode();

				if (!FTPReply.isPositiveCompletion(reply)) {
					ftp.disconnect();
					System.err.println("FTP server refused connection.");
					System.exit(1);
				}
			}
		} catch (IOException e) {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException f) {
					// do nothing
				}
			}
			System.err.println("Could not connect to server.");
			e.printStackTrace();
			System.exit(1);
		}
	}

	private void downloadDir(String local, FTPClient ftp, String remote)
			throws FileNotFoundException, IOException {

		System.out.println("dir: " + remote);
		ftp.changeWorkingDirectory(remote);
		new File(local).mkdirs();
		FTPFile[] files = ftp.listFiles(remote);

		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				downloadDir(local + "/" + files[i].getName(), ftp, remote + "/"
						+ files[i].getName());
			} else {
				downloadFile(local + "/" + files[i].getName(), ftp, remote
						+ "/" + files[i].getName());
			}
		}
	}

	private void downloadFile(String local, FTPClient ftp, String remote)
			throws FileNotFoundException, IOException {

		BufferedOutputStream output;

		output = new BufferedOutputStream(new FileOutputStream(local));

		System.out.println("downloading " + remote);
		ftp.retrieveFile(remote, output);
		
		output.flush();
		output.close();
		output = null;
	}
```


----------



## Garrona (18. Juli 2008)

Da die Probleme auch mit LeechFTP auftraten (Connection write error), habe ich die WorkAround Lösung überarbeitet. 

Lösung über Workaround:


```
private void downloadFile(String local, FTPClient ftp, String remote)
			throws FileNotFoundException, IOException {

		BufferedOutputStream output = null;
		System.out.println("downloading " + remote);

		try {

			output = new BufferedOutputStream(new FileOutputStream(local));

			ftp.retrieveFile(remote, output);
			// System.out.println(ftp.getReplyString());

		} catch (SocketException e) {
			if (output != null) {
				output.flush();
				output.close();
				output = null;
			}
			ftp.disconnect();
			connect(ftp, server);
			logOn(username, password);

			output = new BufferedOutputStream(new FileOutputStream(local));

			ftp.retrieveFile(remote, output);
			// System.out.println(ftp.getReplyString());

		} finally {
			if (output != null) {
				output.flush();
				output.close();
				output = null;
			}
		}
```


----------

