# zip-files über sockets übertragen



## schäflein (5. Jan 2007)

Hier der Auszug des Servers:


```
for (int i=0; i<countGamesToDownload; i++)
				    {
				    	out.write(gamesToDownload.get(i) + ".zip\n");
				    	out.flush();
				    	filename=System.getProperty("user.dir")+"\\"+ gamesToDownload.get(i)+".zip";
				    	System.out.println("Filename: " + filename);
				    	bin = new BufferedInputStream(new FileInputStream(filename));
				    	int bytesRead = 0;
					    byte buffer[] = new byte[2048];
					    while((bytesRead =bin.read(buffer))>0)
					        bout.write(buffer, 0, bytesRead);
					    bout.flush(); 
				    	
				    }
```


und hier der entsprechende Auszug des Clients:


```
bin = new BufferedInputStream(socket.getInputStream()); 
					
					for (GameInfo gi : gamesToDownloadVec)
					{
						 filename= "C:\\Temp\\" + in.readLine();
						 System.out.println ("Filename: " + filename);
					      bout = new BufferedOutputStream(new FileOutputStream(filename));
					      int bytesRead = 0;
					      byte buffer[] = new byte[2048];
					      while((bytesRead =bin.read(buffer))>0)
					        bout.write(buffer, 0, bytesRead);
					      bout.flush(); 
					      
					      bout.close();
}
```

Beim zweiten Mal, wenn ich ein zip-file übertragen möchte, erhalte ich folgenden filenamen: 
Filename: C:\Temp\PK
und hinter dem PK sind eben lauter sonderzeichen, die eigentlich nicht dort sein sollten, der filename enthält auch keine umlaute. 

Außerdem wird nur der äußerste ordner z.B. Game1.zip gespeichert und nicht die ordner die darin sind...

Es wäre sehr nett, wenn mir jemand helfen könnte.

Falls ihr euch bei der Beschreibung nicht auskennt, oder nicht erkennt wo mein Problem is und trotzdem willig seid zu helfen, meldet euch und ich werde versuchen es anders zu erklären...

Danke schonmal!


----------



## Wildcard (5. Jan 2007)

schäflein hat gesagt.:
			
		

> Außerdem wird nur der äußerste ordner z.B. Game1.zip gespeichert und nicht die ordner die darin sind...
> ...
> Falls ihr euch bei der Beschreibung nicht auskennt, oder nicht erkennt wo mein Problem is und trotzdem willig seid zu helfen, meldet euch und ich werde versuchen es anders zu erklären...


Da fängt's bei mir schon an. Was bitte meinst du damit? Ein zip ist kein 'Ordner'


----------



## Murray (5. Jan 2007)

Was ist denn im Client-Fragment der Stream in? Ist da evtl. bin gemeint? Das Ergebnis sieht nämlich so aus, also würdest Du im Client den Dateinamen und danach den Dateiinhalt vom Socket lesen, während Du serverseitig ja den Dateinamen in die Standardausgabe und den Dateiinhalt auf den Socket schreibst. Es wird also im Client der Inhalt des Zip-Files bis zum ersten Zeilenendezeichen als Dateiname interpretiert.

"PK" und Sonderzeichen sind der Anfang des Dateiinhalts (sieht Dir mal die Zip-Date im Hex-Editor oder ersatzweise mit "type" vom Dos-Prompt aus an).


----------



## Guest (5. Jan 2007)

Wildcard hat gesagt.:
			
		

> schäflein hat gesagt.:
> 
> 
> 
> ...



Verzeihung war gestern schon ein wenig spät....

Ich hab damit folgendes gemeint:
Ich habe eine Ordner-Struktur die sieht so aus:
Game1
     Picture
     Sound
     .....

Diesen Game1 Ordner mach i jetz zu einem zip-Archive und will das dann übertragen...

Nur am Client kommt nur Game1 an und kein Picture etc....


----------



## Guest (5. Jan 2007)

Murray hat gesagt.:
			
		

> Was ist denn im Client-Fragment der Stream in? Ist da evtl. bin gemeint? Das Ergebnis sieht nämlich so aus, also würdest Du im Client den Dateinamen und danach den Dateiinhalt vom Socket lesen, während Du serverseitig ja den Dateinamen in die Standardausgabe und den Dateiinhalt auf den Socket schreibst. Es wird also im Client der Inhalt des Zip-Files bis zum ersten Zeilenendezeichen als Dateiname interpretiert.
> 
> "PK" und Sonderzeichen sind der Anfang des Dateiinhalts (sieht Dir mal die Zip-Date im Hex-Editor oder ersatzweise mit "type" vom Dos-Prompt aus an).




Ganz versteh ich das nicht, wieso wird der Inhalt des zip-files bis zum ersten Zeilenendezeichen als Dateiname interpretiert?

server:

```
out = new BufferedWriter (new OutputStreamWriter (sock.getOutputStream(),"UTF-8"));
```

client:

```
in = new BufferedReader (new InputStreamReader (socket.getInputStream(), "UTF-8"));
```

ich hab irgendwie ein paar verschiedene streams verwendet, is wahrscheinlich nicht optima...


----------



## schäflein (5. Jan 2007)

so, hab jetz beim FileInputStream nicht den filename (also String) sondern new File(filename) gewählt und jetz wird zumindest das 1. Archiv richtig übertragen...


----------



## Guest (5. Jan 2007)

schäflein hat gesagt.:
			
		

> so, hab jetz beim FileInputStream nicht den filename (also String) sondern new File(filename) gewählt und jetz wird zumindest das 1. Archiv richtig übertragen...



war wohl nur ein glückstreffer, jetz geht es nicht mehr, obwohl ich nichts verändert habe...


----------



## Murray (5. Jan 2007)

Client-Code hat gesagt.:
			
		

> ```
> filename= "C:\\Temp\\" + in.readLine();
> ```



Diese Stelle hier meine ich - da wird doch der Dateiname aus dem Stream gelesen.

Auf der Server-Seite wird aber nur der Date*inhalt* auf den Stream geschrieben; insofern liest der Client den Beginn des Inhalts und interpretiert diesen als String, was i.d.R. nicht klappen wird.


----------



## Guest (5. Jan 2007)

Murray hat gesagt.:
			
		

> Client-Code hat gesagt.:
> 
> 
> 
> ...




```
out.write(gamesToDownload.get(i) + ".zip\n");
```

Diese Zeile schickt den Dateinamen...

Eine Frage hätte ich noch, wenn i mittels BufferedOutputStream was schreibe, wird dann solange mit dem nächsten schreiben gewartet, bis der Client sich die Nachricht vom Socket geholt hat?

wenn ich nämlich nur eine Datei schick, dann funktioniert alles...
schicken ich aber zwei, dann is der zweite Dateiname null...[/code]


----------



## Murray (5. Jan 2007)

Anonymous hat gesagt.:
			
		

> ```
> out.write(gamesToDownload.get(i) + ".zip\n");
> ```
> 
> Diese Zeile schickt den Dateinamen...



Stimmt, hatte ich nicht gesehen; sorry.


----------



## Murray (5. Jan 2007)

Andererseits deutet das Verhalten eben doch darauf hin, dass hier der Anfang eines Dateiinhaltes als Dateiname interpretiert wird (denn "PK" sind eben zwei "magic bytes" am Anfang einer Zip-Datei, und danach folgen Binärdaten, die als String interpretiert eben lauter Sonderzeichen ergeben).

Möglicherweise liegt das an den verschiedenen Streams out und bout, die getrennt voneinander geflushed werden?


----------



## schaefli (5. Jan 2007)

habe mein problem auch in ein anderes forum gepostet, nachdem ich noch ein wenig probiert habe, und es könnte wirklich wegen den verschiedenen streams sein...aber ich habe eine andere möglichkeit gefunden, wie ich zu den dateinamen kommen ohne sie übern socket schicken zu müssen, trotzdem hat sich das problem nicht gelöst...
http://forum.java.sun.com/thread.jspa?threadID=5121673


----------

