# Probleme mit OutputStream



## Planetasia (1. Jul 2009)

Hallo,

Ich habe gerade gemerkt, dass sobald ich einen OutputStream schliesse, dass der Socket genauso geschlossen wird. Wie kann ich das umgehen? 

Was ich machen will ist, ich will Nachrichten sowie Datein über Sockets senden können.Allerdings soll die Verbindung aufrecht bleiben und nicht nach dem ersten File geschlossen werden! 

mein Code zum Senden einer Datei vom Client zum Server: 

```
public void WriteMesssage(File f){
		
		//Hier wird dem Server mitgeteilt, dass ein File kommt
		out.println("File");
		out.flush();
		
		File myFile = f;
		out.println(myFile.getName()); 	//Hier wird der Name und FileTyp gesendet!
		int size;
		byte data[]= new byte[1024];
	    try {
			FileInputStream fileStream= new FileInputStream(myFile);
						
			//Hier wird das file gesendet!
			while((size=fileStream.read(data))!=-1){
				os.write(data, 0, size);
				os.flush();  //os = OutputStream
			}
			
			fileStream.close(); // Schliesst das File wieder
			os.close(); // Hier liegt das Problem.... Socket wird genauso geschlossen!
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    
	
	}
```

Kann mir bitte wer weiterhelfen?


----------



## Michael... (1. Jul 2009)

Warum schließt Du den Stream überhaupt? Er ist doch die einzige Verbindung zum ServerSocket.


----------



## Planetasia (1. Jul 2009)

nein.... das ist nur eine Methode zum senden von Datein... das restliche ist in der run() von Runnable
habe einen Socket auch...
Wenn ich diesen nicht schliesse dann wird die Datei vom Server nicht weiter an die anderen Clients gesendet. 
Muss ganz ehrlich sagen ich kenn mich kaum aus, bin eben grad dabei das zu lernen ;-)


----------



## Michael... (1. Jul 2009)

Bin auch nicht der Socket-Experte, aber wenn Du den OutputStream kappst, kappst Du ja auch die Verbindung.
Dass der Server die Datei nicht verteilt, liegt vermutlich daran, dass er nicht mitbekommt wann die Datei komplett übertragen ist. Welche Streams benutzt Du denn?


----------



## Planetasia (1. Jul 2009)

Genau das hab ich mir eben auch gedacht, dass er nicht weiss wann die datei fertig ist... 
zum senden/empfangen von Datein verwende ich Input- OutputStreams
für Nachrichten aus dem Chat verwende ich PrintWriter zum senden und BufferedReader zum empfangen!


----------



## tuxedo (1. Jul 2009)

Das was du brauchst nennt sich "Protokoll". Mit unterschiedlichen Streamtypen die man für unterschiedliche Zwecke auf und wieder zu macht geht das nicht. 

Schau dir mal RMI oder SIMON an... Oder lerne ein Protokoll zu schreiben mit dem du die Daten auf dem Stream separieren kannst.

- Alex


----------



## Planetasia (2. Jul 2009)

Hallo tuxedo.... also ich habe heute noch einiges ausprobiert.... funktioniert hat leider nichts....
hab öfters gelesen, dass man die größe der File braucht und dann die bytes einlesen kann. Das hätte ich jetzt probiert. Allerdings kommt da gar nix an.... kannst du mir vielleicht weiterhelfen?

Senden der Datei:

```
public void WriteMesssage(File f){
		
		out.println("File");
		out.flush();
		File myFile = f;
		
		out.println(myFile.getName());
		 
		 int size;
		 byte data[]= new byte[1024];
	    try {
			
			
			FileInputStream file= new FileInputStream(myFile);
			DataOutputStream dataOut = new DataOutputStream(new BufferedOutputStream(mClient.getOutputStream()));
			
			dataOut.writeLong(myFile.length());
			
			while((size=file.read(data))!=-1){
				os.write(data, 0, size);
				os.flush();
			}
			
			file.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    
	
	}
```

und so würde ich empfangen:

```
if(line.equals("File")){	
					 
			        byte data[] = new byte[1024];
			        
			        String NameofFile=in.readLine();
			        FileOutputStream fileOut = new FileOutputStream("C:\\Server\\"+NameofFile);
			        int size;
			        DataInputStream dataIn = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
					//-----------------------------------------
						long lenght=dataIn.readLong();
					//------------------------------------
					
						
						// Datei zwischen speichern! 
			        
			     for(int i=0; i<lenght/1024; i++)   
			      {	
			    	 	size = is.read(data);			        	  
			        	fileOut.write(data, 0, size);
			                fileOut.flush();
			            
			        }
			        
			        fileOut.close();
}
```

Das empfangene File bleibt leer....
Was mach ich da falsch??

lg


----------



## tuxedo (2. Jul 2009)

Tja. Da musst du debuggen. Aber so wie es aussieht ´mischst du immer noch fleissig die Streamtypen.

Einmal benutzt du beim sender "out" um was rauszu schreiben, weiter unten dann auf einmal "dataOut". Wie gesagt: Streamtypen mischen ist, wie du nun praktisch siehst, keine gute Idee. 

Bleib doch einfach komplett beim DataInputStream bzw. beim DataOutputStream .. Die können alles: String, primitive Datentypen, Objekte, ....

Siehe dazu auch: http://www.java-forum.org/netzwerkp...n-kommen-anders-als-gesendert.html#post533110

- Alex


----------

