# Server meets Client



## bRainLaG (29. Okt 2009)

Ich hab schon eifrig die Sufu benutzt komm allerdings nicht weiter. Ich muss vom Server an den Client eine Audiodatei übergeben. Auf Clientseite komm ich bis dahin gut zurecht, allerdings komme ich mit dem Outputstream nicht wirklich weiter wie ich das ganze übergeben kann.


```
public class Server {
	ServerSocket server = new ServerSocket(12341);
	
	Server () throws  IOException {
		
		while ( true ) {
			Socket client = server.accept();
			BufferedReader br = new BufferedReader (new InputStreamReader(client.getInputStream()));
			
			File f = new File( "URL/song1.wav");
			
			FileOutputStream fs = new FileOutputStream(f);
			//new BufferedOutputStream(new FileOutputStream(("song1.wav")));
		}
	}	
			public static void main (String[] args) {
				try {
					Server server = new Server();
				}
					catch (IOException e) {
						System.out.print(e);
				}
			}
		}
```

Ich finde einfach nicht raus wie ich die Soundfile nun vom Server an den Client übergeben kann.

Hoffe ihr könnt mir da weiterhelfen.


----------



## bRainLaG (29. Okt 2009)

Habs mal nun etwas abgeändert synktaktisch scheints richtig zu sein wollt aber mal ne zweite Meinung einholen ob die file dann auch wirklich übertragen wird weil ich beim client noch nicht ganz so weit bin


```
public class Server {
	ServerSocket server = new ServerSocket(12342);
	
	Server () throws  IOException {
		
		while ( true ) {
			Socket client = server.accept();
			BufferedReader br = new BufferedReader (new InputStreamReader(client.getInputStream()));
			
			File f = new File( "Dateipfad/SoundJava/song1.wav");
			
			BufferedWriter datei = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( "Dateipfad/song1.wav" ) ) );
			System.out.println(datei);
		}
	}	
			public static void main (String[] args) {
				try {
					Server server = new Server();
				}
					catch (IOException e) {
						System.out.print(e);
				}
			}
		}
```


----------



## Michael... (29. Okt 2009)

Wohin übertragen?? Du schreibst gar nichts raus - weder in einen Stream noch in eine Datei.
Hier mal was zum Nachlesen:
http://www.java-forum.org/java-faq-beitraege/5507-netzwerkgrundlagen-serversocket-socket.html#post27237


----------



## bRainLaG (29. Okt 2009)

grundsätzlich gehts darum das der Server vom Client eine Anfrage bekommt nach einer Musikdatei, deswegen habe ich oben auch nur einen Bufferedreader verwendet. Hab das ganze als Trockenübung mit Hello World gemacht, dabei langte es allerdings lediglich einen Printwriter zu verwenden um das Hello World vom Server an den Client zurück zu geben.

Nun versuche ich das ganze mit einer.wav Datei wo ich halt nicht genau weiter komme wie ich die übertrage beziehungsweise bei einer file ich ja keinen Printwriter verwenden kann.


----------



## Michael... (29. Okt 2009)

bRainLaG hat gesagt.:


> ```
> BufferedWriter datei = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( "Dateipfad/song1.wav" ) ) );
> ```


Du musst in den OutputStream des Client-Sockets schreiben. So hast Du ja nur eine Writer der auf dem Serversystem in eine Datei schreiben kann.

Ich würde zum schreiben DataOutputStream verwenden.


----------



## bRainLaG (29. Okt 2009)

Das ist ja so das was ich nicht ganz verstehe wenn ich eine Datei übersenden will von Server zum Client warum müsste das dann auf Client Seite stehen, hätte angenommen, dass das beim Client eher im Inputstream steht, weil er es ja empfängt


----------



## Michael... (29. Okt 2009)

bRainLaG hat gesagt.:


> warum müsste das dann auf Client Seite stehen


??? Verstehe ich nicht ???
Es war doch die ganze Zeit nur die Rede von der serverseitigen Implementierung.
Ob Textnachrichten schickst oder Dateien ist im Prinzip egal.
Wenn das mit Deinem Hello World geklappt hat musst Du zunächst einmal
die out und in Streams z.B. auf DataOutPut und DataInputStream umstellen, die richtigen Methoden zum Schreiben und Lesen verwenden...

Weiss nicht ob man so eine Datei über eine ObjectStream schicken kann (und wenn's geht würde ich es nicht unbedingt machen) --> daher brauchst Du auch noch ein Protokoll


----------



## bRainLaG (29. Okt 2009)

Naja ist schon richtig, da ich das bei Hello World mit dem printwriter zurück gegeben habe muss ich nun umdenken habs mal auf nen Fileoutputstream umgestellt, und mich bisschen hier im forum noch umgesehen wie man die musikdatei auf bytes aufgeteilt kriegt. 

Server:


```
public class Server {
	ServerSocket server = new ServerSocket(12342);
	
	Server () throws  IOException {
		
		while ( true ) {
			Socket client = server.accept();
			
			BufferedReader br = new BufferedReader (new InputStreamReader(client.getInputStream()));
			
			File f = new File ("/Users/bRainLaG/Downloads/SoundJava/song1.wav");
		
			
			byte[] buffer = new byte[250];
			FileOutputStream Ausgabe = new FileOutputStream(f);
			 int len = 0;
			  while ((len = Ausgabe.read(buffer)) > 0) {
			      Ausgabe.write(buffer);
			  }
			
			  Ausgabe.flush();
			  
			 
			
			
		}
	}
			
		          
		          public static void main (String[] args) {
				try {
					Server server = new Server();
				}
					catch (IOException e) {
						System.out.print(e);
				}
		}
}
```

das einzige wo er dabei rumzickt ist while ((len = Ausgabe.read(buffer)) > 0)  
Hintergrund Idee ist halt die Musikdatei in Bytes aufzuspalten um diesen dann in Richtung des Clients zu schicken.

Hoffe das passt jetzt etwas besser bin auf dem Gebiet noch recht unerfahren.

P.S. 
Hätte noch die Idee das das mit dem File bereits im Client stehen könnte, das er direkt anfragt, weil ich bis jetzt lediglich implementiert habe das der Client eine Anfrage stellt.


----------



## Zebadev59 (29. Okt 2009)

FileOutputStream ist eigtl dazu da um in eine Datei zu schreiben. Ausgabe.read(buffer) kann doch auch gar nicht funktionieren oder? FileOutputStream hat doch gar keine read() Methode?


----------



## bRainLaG (29. Okt 2009)

naja der Dataoutstream klappt auch nicht wenn ich die datei mit file f einlese, deswegen hab ich es mit dem fileoutstream versucht.


----------



## Michael... (29. Okt 2009)

Mit folgendem Code kann der Server einmalig eine Datei an den Client schicken:

```
ServerSocket serverSocket = new ServerSocket(5555);
	while (true) {
		Socket socket = serverSocket.accept();
		DataOutputStream out = new DataOutputStream(socket.getOutputStream());
		byte[] buffer=new byte[1024];
		FileInputStream fileIn = new FileInputStream(new File("c:\\test.txt"));
		int len;
		while ((len = fileIn.read(buffer))>0) { 
			out.write( buffer, 0, len ); 
		}
		fileIn.close();
		out.close();
	}
```


----------



## bRainLaG (29. Okt 2009)

Michael... hat gesagt.:


> Mit folgendem Code kann der Server einmalig eine Datei an den Client schicken:
> 
> ```
> ServerSocket serverSocket = new ServerSocket(5555);
> ...



Hab das mal teilweise so angepasst, wie es bei dir drin steht, das problem mit read habe ich nach wie vor, und dazu kommt innerhalb deines codes noch das er beim DataOutputStream mit socket als normale Variable anzeigt, die ich vorher deklarieren müsste


----------



## Michael... (29. Okt 2009)

bRainLaG hat gesagt.:


> das problem mit read habe ich nach wie vor


Was für ein Problem mit read??
Bezieht sich das noch auf Dein ursprüngliches Bsp?
In dem versuchst Du einen OutputStream zu lesen und der kann eben nur "outputten" also schreiben.

[edit]Den Rest verstehe ich nicht


----------



## bRainLaG (29. Okt 2009)

Naja es ist wie weiter oben schonmal erwähnt da sich read bei dir auf den Fileoutputstream bezieht und dieser keine read Variable besitzt klappt das ganze nicht


----------



## Michael... (29. Okt 2009)

bRainLaG hat gesagt.:


> Naja es ist wie weiter oben schonmal erwähnt da sich read bei dir auf den Fileoutputstream bezieht und dieser keine read Variable besitzt klappt das ganze nicht


Wieso brauchst Du im Servercode einen FileOutputStream?? Du willst doch Du Datei einlesen und dem Client schicken (genau das macht mein Codeausschnitt) speichern soll doch der Client, der könnte was mit einem FileOutputStream anfangen.


----------



## bRainLaG (29. Okt 2009)

ahhh sry hab den tag soviel mit quelltext gelesen, dass ich deinen nicht genau gelesen habe server funzt jetzt 

vielen vielen dank


----------

