# Datentransfer bricht nicht ab



## Stiewen-222 (4. Aug 2008)

Hi,

mein FileTransfer funktioniert zwar super, doch die Methode bleibt in der Schleife und kommt erst zur Ausgabe: Server: Datei Ende, wenn ich das Socket schliesse...

Koennt ihr mir vll helfen?


```
public boolean receive_File ( String strFileName ) {
		// Sends the entered file to the client
        try {
        	FileOutputStream fosFile = new FileOutputStream ( new File ( strFileName ) );
        	
        	int intLen = 4096;
        	byte[] byBytes = new byte [ intLen ];
            while ( ( intLen = oisFromClient.read ( byBytes ) ) > -1 ) {
            	fosFile.write ( byBytes, 0, intLen );
            	fosFile.flush (  );
            	
            }
         
            fosFile.close (  );
            System.out.println ( "--- Server: Ende der Datei" );

        } catch (IOException ioe) {
			int intError = 15;
			System.out.println ( "Error " + intError + ": " + ioe.toString (  ) );
			return false;
			
        }
		
		return true;
	
	}
```


----------



## SlaterB (4. Aug 2008)

so ist das eben, welches Verhalten schwebt dir denn vor? 
dass abgebrochen wird, wenn aktuell keine Daten zu empfangen sind?
und wenn mal ein paar Pakete hängen bleiben im Internet dann wird an beliebiger Stelle abgebrochen?

-1 kommt nur wenn der Socket zu Ende ist,
solange liefert ein read-Aufruf Daten, falls vorhanden oder wartet

schicke doch vor der Datei die Anzahl der Bytes als int-Wert,
dann kannst du dich beim Lesen danach richten


----------



## Guest (4. Aug 2008)

na, es geht mir ja nur darum, dass er aus der schleife da rauskommt.

ich kann das socket aber nicht schliessen, weil danach noch andere dinge gesendet werden sollen damit.

ich hatte auch schon die idee es so zu machen:


```
public boolean receive_File ( String strFileName ) {
		// Sends the entered file to the client
        try {
        	FileOutputStream fosFile = new FileOutputStream ( new File ( strDLDir + "/" + strFileName ) );
        	
        	int intMaxLen = 4096;
        	int intLen = intMaxLen;
        	byte[] byBytes = new byte [ intLen ];
            while ( ( intLen = oisFromClient.read ( byBytes ) ) > -1 ) {
            	fosFile.write ( byBytes, 0, intLen );
            	fosFile.flush (  );
            	
            	if ( intLen < intMaxLen )
            		break;
            	
            }
         
            fosFile.close (  );

        } catch (IOException ioe) {
			int intError = 15;
			System.out.println ( "Error " + intError + ": " + ioe.toString (  ) );
			return false;
			
        }
		
		return true;
	
	}
```

Sprich mit dem MaxLen, doch dann kommt eine java.iptionalDataException


----------



## SlaterB (4. Aug 2008)

weil du eine Abfrage
> if ( intLen < intMaxLen ) 
>                  break; 
in deinem Code hast, kommt eine OptionalDataException?
dies ist nicht nachzuvollziehen,

die Abfrage ist durchaus eine Änderung, 
hat aber immer noch das theoretische Problem, dass auch an beliebiger Stelle in der Übertragung abgebrochen wird, wenns mal Stau im Internet gibt,
sowie das praktische Problem, dass wohl nix passiert, wenn die Länger der Datei durch 4096 teilbar ist oder durch sonstige Umstände der letzte Block genau 4096 lang ist


----------



## Guest (4. Aug 2008)

Also, ich habe es hinbekommen.

Jetzt habe ich nur noch eine frage: Mein Programm funktioniert soweit wunderbar, wenn ich es im Editor (Eclipse UND JavaEditor vom bildungsministerium) auf nur einem rechner und auf zwei rechnern ausprobiere (connection auf einem rechner und connection zwischen zwei rechnern)

Doch wenn ich den client in eine jar datei packe, dann startet das programm, doch er bekommt keine verbindung mehr hin...

Kann mir das jemand erklaeren? ^^


----------



## Hausmeister (4. Aug 2008)

Stimmt der Path zu den für die Datenbankverbindung benötigten Datein?


----------



## Stiewen (4. Aug 2008)

Ich mach Server - Client verbindung.

Hab im Netz jetzt schon von 2 Leuten gelesen, dass sie das Problem hatten, wenn sie auf eine DB zugreifen wollten.
Der einer hat es behoben, indem er in der Konsole sich die Javaversion angezeigt hat mit java -version und das mit der MANIFEST-Datei gleichgestellt hat. 
Der andere hat seine jar datei mit dem Jar-Editing-Tool fuer Eclipse gemacht und schon funktionierte es.

Beide Loesungen haben mir nicht weiter geholfen und ich kann es mir auch nicht erklaeren, 
DENN: die GUI wird vollkommen und zu 100% richtig angezeigt. Das Programm, was in der Jar sitzt ist der Client und kann nur aus der Jar datei heraus keine Verbindung aufbauen... 

Sehr seltsam...


----------



## HoaX (6. Aug 2008)

welche fehlermeldung kommt denn beim connect?


----------



## Stiewen (9. Aug 2008)

es kommt keine ... das isses ja ^^

er laedt die GUI und macht nix weiter. er geht einfach nur ins Time-Out bei der funktion Socket.connect(...)

es scheint, als wenn er, wenn er aus der jar heraus startet, zwar den suchvorgang startet, doch keinen server findet.


----------



## tuxedo (10. Aug 2008)

Vermutlich hast du irgendwo ein try/catch block ins leere laufen lassen.

Damit das mit der DB funzt muss der DB treiber (das jdbc teil) im classpath sein. 

- Alex


----------



## Stiewen (11. Aug 2008)

ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ICH WILL KEINE DATENBANKVERBINDUNG EINRICHTEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Wie oft soll ich das denn noch schreiben ... 
Danke aber fuer die Bemuehungen


----------



## tuxedo (11. Aug 2008)

Vermutlich hast du irgendwo ein try/catch block ins leere laufen lassen.... Wie oft soll ich das denn noch schreiben?

Ein Programm verweigert nicht auf einmal seinen Dienst ohne dabei irgend was zu sagen. Aber wenn man ihm aber den Mund verbietet darf man sich nicht wundern dass es schweigt. Also schau nochmal ob du nicht irgendwo eine Exception in einem catch-block hast ins leere laufen lassen.

Das mit dem Classpath sollte im übrigen nur als Ergänzung dienen weil du weiter oben noch von Manifest und JAR gefaselt hattest.

- Alex


----------



## Stiewen (11. Aug 2008)

Stiewen hat gesagt.:
			
		

> er geht einfach nur ins Time-Out bei der funktion Socket.connect(...)
> 
> es scheint, als wenn er, wenn er aus der jar heraus startet, zwar den suchvorgang startet, doch keinen server findet.



-> catch ist also connection timed out

habs jetzt mit meiner lokalen ip probiert und das geht super.
bedeutet also, dass ich irgendwas mit fw, router, portforwarding, etc... falsch eingestellt haben muss.

jetzt wuerde ich doch gerne mal wissen, wie das icq und so macht, weil ICH fuer die ja keine ports freigeben muss. sind die schon fest verankert oder wie geht das?


----------



## tuxedo (11. Aug 2008)

Dir fehlt es offenbar and grundlegenden Netzwerkkenntnissen:

Ein Client verbindet sich mit einem Server. Der Server horcht auf einem speziellen Port.

Der Port gehört also zum Server. Ergo muss man den Server (bzw. dessen Firewall oder dessen Router) so einstellen, dass man von "aussen" an diesen Port dran kommt.

Der Client hat damit in der Regel nix zu tun. Nur "zu restriktive" (private) Firewalls blockieren auch ausgehende Verbindungen (ZoneAlarm ist da so ein Kandidat), so dass man auch beim Client was einstellen muss.

Man kann sich aber so in etwa merken: Wenn der ICQ-Client sich mit dem Server verbinden kann, dann sollte sich auch mein Pava-programm-Client sich mit dem Server verbinden lassen, ohne etwas anderes konfigurieren zu müssen als bei der ICQ Verbindung.

Skype geht da einen anderen Weg (google mal nach "udp hole punching"), braucht aber einen extra Server hierfür.

Ich schlage vor du malst mal eine Skizze wie dein Client und Server zueinander in beziehung stehen (router etc...). Dann lässt sich schon eher sagen warum die Verbindung nicht klappt und wo es hängen könnte.

- Alex


----------



## Stiewen (11. Aug 2008)

SKIZZE:

SERVER - ROUTER - INTERNET - CLIENT

mein router ist uebrigens der "THOMSON ST585" 
- UDnP aktiv, 
- Port freigegeben,
- FW disabled


heisst, dass mein server hinterm router sitzt und auf den client wartet. und nein, ich wusste alles, was du mir da geschrieben hast bzgl. der verbindung.
dann besteht doch eigentlich nur die frage, warum der client keine verbindung mit dem server eingeht.


----------



## tuxedo (11. Aug 2008)

Hast du am Router Portforwarding für den Server konfiguriert?

Wenn ja:

Starte mal am Client-Rechner eine Telnetverbindung:

START -> Ausführen -> Textfeld: "telnet 123.123.123.123 1234" -> OK

(statt 123.123.123.123 die IP des Servers eintragen und statt 1234 den Port der Serveranwendung).

Bleibt das Telnetfenster offen, hast du vermutlich am Client was falsch programmiert, weil prinzipiell die Netzwerkverbindung klappt.

Schließt sich das Telnetfenster unverzüglich wieder, hast du ein Netzwerkproblem. In dem Fall tippe ich auf Firewall/Portforwarding nicht richtig eingestellt.

- Alex


----------



## Stiewen (11. Aug 2008)

So, ich habe es hinbekommen!

Bei dem router gibt es einen link in dem menu, wenn man auf einen computer klickt und sich die daten davon ansieht. bei mir war das >MEINCOMPUTERNAME<

unten sind doch immer diese links mit hilfen, was man jetzt machen koennte. da ist auch der link "Öffentliche IP-Adresse einer Verbindung einem Gerät zuweisen"

Das habe ich gemacht. Es erscheint eine meldung, dass man lokal die ip adresse erneuern soll, was man ueber die eingabeaufforderungen
ipconfig /release
ipconfig /renew

erreicht. wichtig: beide und vor allem in der reihenfolge!

Hoffe ich konnte helfen


----------



## tuxedo (11. Aug 2008)

Genau das nennt sich "Portforwarding" ...

- Alex


----------

