Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

1

28.02.2012, 16:44

[Java] SocketError bei listFiles() mit FTPClient

Hallo,

ich möchte in meinem Java-Spiel eine Verbindung zu einem FTP-Server herstellen, dafür verwende ich die org.apache.commons.net.ftp.* Libraries. Das Verbinden, ein loggen, ausloggen und disconnecten klappt auch gut, nur sobald ich irgendwelche Befehle ausführe, bekomme ich einen Socket Error.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FtpTest 
{
    public static void main(String[] args) throws IOException 
    {
        try
        {
            FTPClient ftp = new FTPClient();
            ftp.connect("ftp.strato.de");
            ftp.login("<user>", "<password>"); //natürlich mit richtigen Daten
        
            FTPFile[] files = ftp.listFiles(); //hier kommt der Fehler
        
            ftp.logout();
            ftp.disconnect();
        
            System.out.println("done");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}


Fehler:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
at sun.nio.cs.StreamEncoder.implFlush(Unknown Source)
at sun.nio.cs.StreamEncoder.flush(Unknown Source)
at java.io.OutputStreamWriter.flush(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at org.apache.commons.net.ftp.FTP.__send(FTP.java:501)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:475)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:552)
at org.apache.commons.net.ftp.FTP.port(FTP.java:877)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:709)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:657)
at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3097)
at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3072)
at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2731)
at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2778)
at FtpTest.main(FtpTest.java:16)

An was kann das liegen? Auch sämtliche vorgefertigten Beispiele laufen auf diesen Fehler hinaus und diese Library ist fpür FTP-bezogene Sachen echt top, d.h. es wäre spitze, wenn das klappen würde.
Vielleicht hatte ja mal jemand denselben Fehler und konnte diesen beheben.
Unter C# klappt es einwandfrei, aber ich will nicht das eigtl. Spiel in Java progammieren und FTP-bezogenes zeug muss dann ein anderes Programm benutzt werden :(

MfG Sascha

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

2

29.02.2012, 11:09

mh ich hab mal ein wenig nach geschaut. Vllt hilt dir das ja weiter. Welche version des JDK's verwendest du? Es kann nämlich sein, dass beim JDK 1.7 ein Bug mit diesem Fall vorhanden ist. In der Dokumentation vom FTPClient steht drinnen, dass man nach jedem Connect den ReplyCode mit

Quellcode

1
int reply = ftp.getReplyCode()


überprüfen sollte. Es kann aber auch sein, dass der Server die Verbindung einfach kappt. Ich probier gleich ein wenig rum ^^

//edit

Welche Version vom commons-net package verwendest du? Ich habs jetzt mit dieser probiert:

Quellcode

1
2
3
4
5
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.0.1</version>
</dependency>


und verwende das JDK 1.6. Mit deinem Code zeigt er mir meine Verzeichnisse von meinem Strato Server an. Also liegt es schon mal nicht an deinem Code.

//edit 2
Wenn du das JDK 1.7 verwendest, ist deine Firewall schuld an dem Fehler

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Saik0« (29.02.2012, 11:23)


Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

3

29.02.2012, 13:18

mh ich hab mal ein wenig nach geschaut. Vllt hilt dir das ja weiter. Welche version des JDK's verwendest du? Es kann nämlich sein, dass beim JDK 1.7 ein Bug mit diesem Fall vorhanden ist. In der Dokumentation vom FTPClient steht drinnen, dass man nach jedem Connect den ReplyCode mit

Quellcode

1
int reply = ftp.getReplyCode()


überprüfen sollte. Es kann aber auch sein, dass der Server die Verbindung einfach kappt. Ich probier gleich ein wenig rum ^^

//edit

Welche Version vom commons-net package verwendest du? Ich habs jetzt mit dieser probiert:

Quellcode

1
2
3
    commons-net
    commons-net
    3.0.1


und verwende das JDK 1.6. Mit deinem Code zeigt er mir meine Verzeichnisse von meinem Strato Server an. Also liegt es schon manetsh advfirewall firewall add rule name=”FTP Service” action=allow service=ftpsvc protocol=TCP dir=inl nicht an deinem Code.

//edit 2
Wenn du das JDK 1.7 verwendest, ist deine Firewall schuld an dem Fehler
Hallo,

die getReply()-Methode gibt 530 zurück, also alles okay seitens des ftp.
Ein "java -version" ergab, dass ich das JDK 1.7 habe, die Version des commons-net Packages ist 3.1

Dann muss ich das wohl irgendwie in der Firewall ausschalten, fragt sich nur wo :-/


Okay: Folgende zwei Zeilen beheben das Problem mit der 1.7er Version:

- cmd als Adminstrator starten
- netsh advfirewall firewall add rule name=”FTP Service” action=allow service=ftpsvc protocol=TCP dir=in
- netsh advfirewall set global StatefulFTP disable

Danach gehts. Danke.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Affje« (29.02.2012, 15:13)


4

13.04.2012, 13:26

Zitat

Okay: Folgende zwei Zeilen beheben das Problem mit der 1.7er Version:


- cmd als Adminstrator starten


- netsh advfirewall firewall add rule name=”FTP Service” action=allow service=ftpsvc protocol=TCP dir=in

- netsh advfirewall set global StatefulFTP disable



Danach gehts. Danke.




Hallo, ich hatte das selbe Problem und konnte dies durch nun beheben. Meine Frage hierzu wäre nun: was genau bewirken diese beiden Zeilen? Und gibt es eine Möglichkeit, diese direkt (also ohne manuelle Eingabe) auszuführen.


Danke schonmals im voraus !!!

Werbeanzeige