Ich habe mir ein Programm geschrieben, welches mir unter anderem Bilder auf einen Server hochlädt.
Dazu verwende ich das Jakarta FTP Paket (commons net ftp) mit einer Wrapper Klasse.
Wenn ich nun Bilder hochlade (besonders bei größeren) kommt es immer wieder zu Timeouts, d.h. er bleibt immer bei irgendeinem Bild hängen...manchmal klappts und manchmal nicht. Auch unabhängig von OS und Internetanbindung.
Manchmal bleibt er hier einfach hängen und manchmal springt er wild zwischen den catch Klauseln rum. Habe mich schon stundenlang gespielt um das Problem in den Griff zu bekommen, bin nun aber komplett ausgebrannt.
Hier ein Auszug des Programms:
CODE
if (e.getSource() == uploadDirB)
{
if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
{
try
{
//Es wird ein eigener Thread erzeugt, um Swingänderungen synchron durchzuführen
new Thread(new Runnable()
{
public void run()
{
//nicht der EDT, GUI Updates
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
//GUI Updates können dann hier von statten gehen.
createDirB.setEnabled(false);
uploadDirB.setEnabled(false);
deleteDirB.setEnabled(false);
}
});
ftp= new TestFTP();
try
{
String galName = list.getSelectedValue().toString();
File[] f = null;
//Verbindungsversuch
if (ftp.connectAndLogin(serverName, "xxx", "xxx"))
{
//Wenn erfolgreich, dann visuelle Rückmeldung
try
{
ftp.setConnectTimeout(10000);
ftp.setDefaultTimeout(10000);
ftp.setSoTimeout(10000);
ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE
);
ftp.binary();
ftp.setPassiveMode(true);
//Wechsel in richtigen FTP Pfad
ftp.changeWorkingDirectory("www");
ftp.changeWorkingDirectory("home");
ftp.changeWorkingDirectory("webshop");
ftp.changeWorkingDirectory("images");
ftp.changeWorkingDirectory("phocagallery");
ftp.changeWorkingDirectory(galName);
FTPFile[] a = ftp.listFiles();
f = fc.getSelectedFiles();
for(lol=0;lol<f.length;lol++)
{
infoL.setText("Ladet hoch... " + (lol+1) + " / " + f.length);
ftp.uploadFile(f[lol].toString(), f[lol].getName());
System.out.println(f[lol].getName());
}
for(int i=0;i<f.length;i++)
{
for(int j=0;j<a.length;j++)
{
if (f[i].getName().equals(a[j].getName()))
{
if (f[i].length() != a[j].getSize())
{
System.out.println(f[i].getName() + " ungleich");
System.out.println("ARGH!!");
reConnect(galName, f[j]);
}
else
{
System.out.println(f[i].getName() + " gleich");
}
}
else
{
if (j == (a.length-1))
{
System.out.println("ARGH!!!");
reConnect(galName, f[j]);
}
}
}
}
}
catch (Exception e1)
{
lol=lol2;
System.out.println("ARGH!!");
reConnect(galName, f[lol]);
}
Hier die Methode reConnect, die ich geschrieben habe, wenn er einen TimeOut abfängt
CODE
public void reConnect(final String galName, final File f)
{
try
{
//Es wird ein eigener Thread erzeugt, um Swingänderungen synchron durchzuführen
new Thread(new Runnable()
{
public void run()
{
//nicht der EDT, GUI Updates
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
//GUI Updates können dann hier von statten gehen.
infoL.setText("Connection TimeOut! Wiederverbindung...");
}
});
ftp= new TestFTP();
try
{
//Verbindungsversuch
if (ftp.connectAndLogin(serverName, "xxx", "xxx"))
{
//Wenn erfolgreich, dann visuelle Rückmeldung
try
{
ftp.binary();
ftp.setPassiveMode(true);
ftp.setConnectTimeout(7000);
ftp.setDefaultTimeout(7000);
ftp.setSoTimeout(7000);
ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE
);
//Wechsel in richtigen FTP Pfad
ftp.changeWorkingDirectory("www");
ftp.changeWorkingDirectory("home");
ftp.changeWorkingDirectory("webshop");
ftp.changeWorkingDirectory("images");
ftp.changeWorkingDirectory("phocagallery");
ftp.changeWorkingDirectory(galName);
ftp.uploadFile(f.toString(), f.getName());
}
catch (Exception e1)
{
System.out.println("AHA11");
reConnect(galName,f);
}
finally
{}
}
else
{
System.out.println("AHA12");
reConnect(galName,f);
}
}
catch(Exception e2)
{
System.out.println("AHA13");
reConnect(galName,f);
}
}
}).start();
}
catch (Exception e1)
{System.out.println("AHA14");}
{
try
{
//Es wird ein eigener Thread erzeugt, um Swingänderungen synchron durchzuführen
new Thread(new Runnable()
{
public void run()
{
//nicht der EDT, GUI Updates
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
//GUI Updates können dann hier von statten gehen.
infoL.setText("Connection TimeOut! Wiederverbindung...");
}
});
ftp= new TestFTP();
try
{
//Verbindungsversuch
if (ftp.connectAndLogin(serverName, "xxx", "xxx"))
{
//Wenn erfolgreich, dann visuelle Rückmeldung
try
{
ftp.binary();
ftp.setPassiveMode(true);
ftp.setConnectTimeout(7000);
ftp.setDefaultTimeout(7000);
ftp.setSoTimeout(7000);
ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE
);
//Wechsel in richtigen FTP Pfad
ftp.changeWorkingDirectory("www");
ftp.changeWorkingDirectory("home");
ftp.changeWorkingDirectory("webshop");
ftp.changeWorkingDirectory("images");
ftp.changeWorkingDirectory("phocagallery");
ftp.changeWorkingDirectory(galName);
ftp.uploadFile(f.toString(), f.getName());
}
catch (Exception e1)
{
System.out.println("AHA11");
reConnect(galName,f);
}
finally
{}
}
else
{
System.out.println("AHA12");
reConnect(galName,f);
}
}
catch(Exception e2)
{
System.out.println("AHA13");
reConnect(galName,f);
}
}
}).start();
}
catch (Exception e1)
{System.out.println("AHA14");}
Dazu muss es doch bessere Lösungen geben?!?
Habt ihr dazu Ideen?
EDIT: Wieso übernimmt der nicht die Tabsprünge in der Codebox?! Kann ja niemand lesen so..
LG
Philipp
Dieser Beitrag wurde von philipp65 bearbeitet: 09. August 2009 - 17:16