# Dateien über Sockets versenden?



## climber (14. Feb 2006)

Hi zusammen,

ich habe einen kleinen Chat programmiert. Soweit ist alles ok, funktioniert alles ohne Probleme. Nun möchte ich gerne noch eine Funktion einbauen, mit der ich Dateien versenden kann. Ich habs mir so gedacht(wenn ich total falsch liege, dann korrigiert mich bitte):
Ich erstelle aus den Input-und Outputstreams eines Clients(Sockets) ein ObjectInput-und OutputStream mit dem ich dann Objekte mit writeObject(Object object) versenden kann(z.B. ein File Objekt).
Nun aber gibt es irgendwie Probleme beim erstellen dieser Streams, das Programm kackt dabei irgendwie ab???

Könnt ihr mir vielleicht n bisschen unter die Arme greifen, wäre echt nett

hier ist noch der code-Ausschnitt bei dem es glaub ich Probleme gibt:

```
....
private void connectServer(){
		try{
			clientSocket= new Socket(host, port);
			serverIn= new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
			serverOut= new PrintWriter(clientSocket.getOutputStream(), true);
			fileIn= new ObjectInputStream(clientSocket.getInputStream());
			fileOut= new ObjectOutputStream(clientSocket.getOutputStream());
......
```
lg stefan[/code]


----------



## Sky (14. Feb 2006)

Anonymous hat gesagt.:
			
		

> Nun aber gibt es irgendwie Probleme beim erstellen dieser Streams, das Programm kackt dabei irgendwie ab???



Ersetze 
- "irgendwie Probleme" durch eine konkrete Beschreibung
- "beim erstellen dieser Streams" durch die genaue Stelle (Zeile)
- "das Programm kackt dabei irgendwie ab" durch Exception ect. 

und Hilfe ist Dir gewiss.


----------



## climber (14. Feb 2006)

also viel besser kann ich es leider auch nicht beschreiben, da keine Exception geworfen wird, zumindest wird nichts angezeigt!
aber ich kann das Problem auf die beiden Zeilen einschränken wo die beiden Objekte fileIn und fileOut initialisiert werden. Wenn ich die diese Zeile heraus nimm, hängt sich das Programm auf:

```
fileOut= new ObjectOutputStream(clientSocket.getOutputStream());
```

wenn ich die andere Zeile heraus nimm und die wieder rein mache:


```
//fileIn= new ObjectInputStream(clientSocket.getInputStream());
			fileOut= new ObjectOutputStream(clientSocket.getOutputStream());
```

dann wird diese Exception geworfen:

```
*** java.net.ConnectException: Connection refused: connect
```


könnt ihr damit was anfangen???


----------



## Guest (14. Feb 2006)

Erstelle zuerst den ObjectOutputStream und erst dann den ObjectInputStream. Dann klappt es vielleicht. Ansonste, have a look hier: http://www.java-forum.org/de/viewtopic.php?t=27445


----------



## climber (14. Feb 2006)

sorry, aber das hilft mir jetzt auch nicht grad weiter

das Problem besteht immer noch


lg stefan


----------



## Beni (14. Feb 2006)

Also was das Problem ist weiss ich nicht, aber ich kann dir sagen, dass dir der ObjectOuput/InputStream nichts nützt.

Denn der wird zwar toll den _Namen der Datei_ versenden, nicht aber die Datei selber... du musst die Datei schon mit einem FileInputStream lesen, die Bytes einzeln schicken, und auf der anderen Seite wieder über einen FileOutputStream auf die Festplatte schreiben.


----------



## stiewen (15. Feb 2006)

Vll hilft dir die Info weiter, dass du so maybe net übers INet Connecten kannst... heißt: wenn deine IP net in deinem lokalen Netzwerk ist, dann kannst du net connecten ... ist bei mir jedenfalls so ... 
wenn doch: SAG MIR BESCHEID WIE DU ES MACHST!!!!!!!!!!!!!!!!!!!!


----------



## The_S (29. Mrz 2006)

Hab gerade das selbe Problem. Habe mittlerweile wahrscheinlich schon alle möglichen kombinationen ausprobiert aber erfolglos ... Momentan sieht es so aus

Server

```
while (true) {
			try {
				ds = dataPort.accept();
			}
			catch (IOException e) {
				e.printStackTrace();
			}
			new Thread(new Runnable() {
				public void run() {
					try {
						Socket dataSocket = ds;
						System.out.println("Server OutputStream");
						ObjectOutputStream temp = new ObjectOutputStream(new GZIPOutputStream(ds.getOutputStream()));
						System.out.println("Server InputStream");
						ObjectInputStream ois = new ObjectInputStream(new GZIPInputStream(ds.getInputStream()));
						System.out.println("Server fertig");
						Object incomming = null;
						while (!dataSocket.isClosed()) {
							if ((incomming = ois.readObject()) != null) {
								servd.handle(incomming);
							}
						}
					}
					catch (IOException e) {
						e.printStackTrace();
					}
					catch (ClassNotFoundException e) {
						e.printStackTrace();
					}
				}
			}).start();
		}
```

Client

```
try {
			Object toRead = null;
			System.out.println("Client InputStream");
			ois = new ObjectInputStream(new GZIPInputStream(data.getInputStream()));
			System.out.println("Client OutputStream");
			oos = new ObjectOutputStream(new GZIPOutputStream(data.getOutputStream()));
			System.out.println("Client fertig");
			while (!data.isClosed()) {
				if ((toRead = ois.readObject()) != null) {
					clientd.handle(toRead);
				}
			}
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
```

Ausgabe beim Server schaut so aus



			
				Server hat gesagt.:
			
		

> Server OutputStream
> Server InputStream



und beim Client so



			
				Client hat gesagt.:
			
		

> Client InputStream





			
				stiewen hat gesagt.:
			
		

> Vll hilft dir die Info weiter, dass du so maybe net übers INet Connecten kannst... heißt: wenn deine IP net in deinem lokalen Netzwerk ist, dann kannst du net connecten ... ist bei mir jedenfalls so ...
> wenn doch: SAG MIR BESCHEID WIE DU ES MACHST!!!!!!!!!!!!!!!!!!!!



Wenn du n Router hast der Dynamic DNS unterstützts funktionierts  :wink: .


----------



## The_S (29. Mrz 2006)

OK, ohne GZIPInput/Outputstream gehts. Aber das will ich so eigentlich net. Weiß jemand warum er blockiert?


----------



## Guest (30. Jun 2008)

gzipstreams warten erst bis sie genügend daten haben, um sie zu senden. so kann der stream nicht initialisiert werden, weil gzip erst sendet, wenn er genügend zusammen hat. gzip ist leider ungeeignet für netzwerktstreams...


----------



## The_S (30. Jun 2008)

Guter Beitrag, lieber spät als nie  .


----------

