1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Java - Ich versteh die Welt nichtmehr…

Dieses Thema im Forum "OS X-Developer" wurde erstellt von MACRASSI, 10.06.08.

  1. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    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
     
  2. appahappa

    appahappa Ingrid Marie

    Dabei seit:
    28.03.07
    Beiträge:
    270
    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.
     
  3. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    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.
     
  4. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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.
     
  5. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    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();
    
     
  6. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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.
     
  7. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    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...
     
  8. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Und warum nicht einfach bei 1 anfangen mit i? ;)
     
  9. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Frage: Warum arbeitest Du einmal mit 128 und einmal mit buffer.length?
     
    MACRASSI gefällt das.
  10. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    21.11.04
    Beiträge:
    1.754
    Hab jetzt überall 128 mit buffer.length getauscht...
     
  11. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    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.
     
  12. MACRASSI

    MACRASSI Gelbe Schleswiger Reinette

    Dabei seit:
    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 =)
     

Diese Seite empfehlen