• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Java - Ich versteh die Welt nichtmehr…

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Also, ich hab einen Server der eine Datei sendet und einen Client der sie empfängt.
Der Server schickt die Datei immer in einem 128Byte Array bis die ganze datei gesendet wurde.
Hab das mit ner for schleife gemacht alles bestens.
Der Client hat die selbe for schleife und weiß auch schon vorher wie groß die Datei werden muss.
Jetzt aber bleibt er mitten in der for schleife stehen. Einfach so ohne fehlermeldung und nix, er macht einfach nicht weiter und der server hat aber seine ganzen pakete schon gesendet.
Dann hab ich gerade eben das ganze mit Breakpoints durch den debugger gejagt und siehe da es hat geklappt, er ist schön durch seine for schleife gegangen der blöde Client.
Danach genau das selbe nochmal ohne breakpoints einfach so ausgeführt und was macht er? bleibt einfach stehen.
Dann gerade eben wieder im debuger und wieder hängt er. :-[

Ich lese die datei mit einem DatainputStream ein (Server) und schreibe sie mit einem DataoutputStream (Client) weg.

Warum klappt das nicht?
Ich hab auch schon mit try und catch was drum gebaut aber gibt irgendwie keine Exception oder IOException.

Ich bin total ratlos...

Grüße Rasmus
 

appahappa

Ingrid Marie
Registriert
28.03.07
Beiträge
273
Eine Schleife bleibt doch nicht einfach so haengen. Dann muss mit dem Code, der in der Schleife aufgerufen wird irgendwas faul sein. Aber ohne zu wissen was genau du machst, wird dir sicherlich keiner helfen koennen.
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Also, gestern war es dann doch etwas spät.
Hier mein Server Code und der vom Client:

Server:
Code:
f_i_s = new FileInputStream(File_Server.PATH + file_name);
d_i_s = new DataInputStream(f_i_s);
			
					
					
file_length = d_i_s.available();
clientSocket.write(String.valueOf(file_length)+"\n");
					
int anzahl_for = 0;
if((file_length % 128) != 0){
	anzahl_for = ((int)(file_length / 128))+1;
} else {
	anzahl_for = file_length / 128;
}

System.out.println("Dateigröße: "+file_length);
System.out.println("Größe Buffer: "+(anzahl_for*128));
System.out.println("Anzahl Löschen: "+(anzahl_for * 128 - file_length));
					
for(int i=0; i <= anzahl_for; i++){
						
	if(i < anzahl_for){
		d_i_s.read(buffer);
	}else{
		d_i_s.read(buffer, 0, (128-(anzahl_for * 128 - file_length)));
	}
	clientSocket.write(buffer, buffer.length);
	System.out.println(i);
}
					
					
					
d_i_s.close();
f_i_s.close();


Client:
Code:
try {
							
							
file_length = Integer.parseInt(clientSocket.readLine());
						
System.out.println(file_length);
						
						
f_o_s = new FileOutputStream(PATH + file_name);
d_o_s = new DataOutputStream(f_o_s);
					
int anzahl_for = 0;
if((file_length % 128) != 0){
	anzahl_for = ((int)(file_length / 128))+1;
} else {
	anzahl_for = file_length / 128;
}
						
						
System.out.println("Anzahl_for: "+anzahl_for);
						
//In dieser Schleife bleibt er einfach hängen, manchmal klappts auch...
for(int i=0; i <= anzahl_for; i++){
	clientSocket.read(buffer, buffer.length);
	if(i < anzahl_for){
			d_o_s.write(buffer, 0, buffer.length);
	}else{
			d_o_s.write(buffer, 0, (128-(anzahl_for * 128 - file_length)));
	}	
}
						
	f_o_s.close();
	d_o_s.close();
							
} catch (IOException e) {
	e.printStackTrace();
}


Wenn es noch fragen gibt einfach stellen.
Ach ja, ich arbeite nicht mit den Sockets von java sondern mit einer Klasse Socket die uns unser Lehrer zur Verfügung gestellt.

Hoffe jetzt kann man mir besser helfen.
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Hast Du mal geschaut, was denn an Daten in der Datei landet? Gibt es eine bestimmte Dateigröße, bei der er einfach anhält? Bist Du sicher, daß Dein "read" und "write" die Daten unverändert durchschieben?

Fragen über Fragen. ;) Vielleicht hilft's ja.
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
So, ein paar kleine Fehler sind mir noch aufgefallen.
Hab nochmal was verändert aber der Fehler ist noch da.
Am Anfang wird ja ne Dateigröße übergeben. Damit rechne ich dann aus, wie oft ich meinem Buffer von 128Byte füllen muss damit die datei fertig ist, natürlich kommt da auch ein rest raus, desshalb der buffer_last der dann die restlichen nimmt.

hab die beiden dateien verglichen.
irgendwie schreibt er am ende der datei, wenn die übertragung mal klappt, das ende nochmal hin. dürfte er ja eigentlich nicht, weil ja der buffer von 128byte nur so lange angewendet wird, bis die datei fast voll ist und im letzten schritt dann nochmal die restlichen byte dann im buffer_last geschickt werden, dieser buffer_last ist aber nur so groß wie die restlichen byte, hab ich ja vorher ausgerechnet.


Server:
Code:
f_i_s = new FileInputStream(File_Server.PATH + file_name);
d_i_s = new DataInputStream(f_i_s);
			
					
					
file_length = d_i_s.available();
clientSocket.write(String.valueOf(file_length)+"\n");
					
int anzahl_for = 0;
if((file_length % 128) != 0){
	anzahl_for = ((int)(file_length / 128))+1;
} else {
	anzahl_for = file_length / 128;
}


buffer_last = new byte[(128 - (anzahl_for * 128 - file_length))];

for(int i=0; i <= anzahl_for; i++){
	
	if(i < anzahl_for){
		d_i_s.read(buffer);
		clientSocket.write(buffer, buffer.length);
	}else{
		d_i_s.read(buffer_last);
		clientSocket.write(buffer_last, buffer_last.length);
	}
	
	System.out.println(i);
}

					
					
d_i_s.close();
f_i_s.close();

Client:
Code:
f_o_s = new FileOutputStream(PATH + file_name);
d_o_s = new DataOutputStream(f_o_s);
					
int anzahl_for = 0;
if((file_length % 128) != 0){
	anzahl_for = ((int)(file_length / 128))+1;
} else {
	anzahl_for = file_length / 128;
}

						
buffer_last = new byte[(128 - (anzahl_for * 128 - file_length))];

//Hier ist irgendwo der Fehler...
for(int i=0; i <= anzahl_for; i++){
	
	if(i < anzahl_for){
		clientSocket.read(buffer, buffer.length);
		d_o_s.write(buffer);
	}else{
		clientSocket.read(buffer_last, buffer_last.length);
		d_o_s.write(buffer_last);
	}	
}

f_o_s.close();
d_o_s.close();
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Du hast eines dieser nicht-trivialen +/- 1 Probleme.

Beispiel: 63 Byte sind zu übertragen.
anzahl_for wird dann zu 1.
buffer_last wird zu 63.

Soweit Korrekt.
Deine Schleife läuft aber für <=1, also für i=0 und i=1, mithin 2(!) Mal.
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Okay, jetzt hab ich i<anzahl_for.
und in der if abfrage in der for schelife dann if(i < anzahl_for-1)
Da hat dann auch alles gut geklappt dann hab cih das ganze nochmal mit ner anderen datei testen wollen und da hat es sich wieder in der empfangschleife aufgehängt...
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Und warum nicht einfach bei 1 anfangen mit i? ;)
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Frage: Warum arbeitest Du einmal mit 128 und einmal mit buffer.length?
 
  • Like
Reaktionen: MACRASSI

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Hab jetzt überall 128 mit buffer.length getauscht...
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
Also, es klappt jetzt schon sehr gut.
Beim letzten einlesen habe ich geprüft ließt er auf der serverseite alles ein und schickt es dann rüber.

Server:
Code:
clientSocket.write(buffer_last, buffer_last.length);

Ich hab geprüft ob da auch alles drinne steht und das passt alles.

Client:
Code:
clientSocket.read(buffer_last, buffer_last.length);
Soll eigenltlich das gesendete byte array empfangen und in buffer_last schreiben.
Danach hab ich geprüft ob da auch alles drinne ist und das ist es nicht. Beide arrays auf server und client seite sind gleich groß.
In diesem fall jetzt 57.
Als ich immer 128er arrays geschickt hat hat alles wunderbar geklappt. Nur jetzt lässt er am ende nen paar buchstaben einfach weg.
 

MACRASSI

Gelbe Schleswiger Reinette
Registriert
21.11.04
Beiträge
1.754
So, irgendwie klappt jetzt doch alles.
Bin fertig und hab kein problem mehr.
Danke für die Hilfe =)