# Socket, Daten über BufferedWriter senden



## danamer (26. Okt 2007)

Hallo zusammen
ich habe einen Java-server und einen Flash-clients (1 Personen-Chat).

Ich sende nun vom Client einen Text, der Server sendetet den Text an den Client zurück.
wenn ich nun beim server die daten über den normalen OutputStream an den Flash-client übergebe, funktioniert alles Prima. wenn ich aber beim Java-Server den BufferedWriter mit der write()-funktion verwende und einen String sende (nicht wie beim OutputStream wo es nur bytes sind) , empfängt der client keine Daten mehr.

Was mache ich falsch?? 
Hoffe es kann mir jemand helfen, danke
gruss Danamer

Hauptserver:


```
import java.io.*;
import java.net.*;

public class StartServer {

	static Thread_connection[] clients;

	static final int MAXSOCKET = 10;

	ServerSocket server;

	public StartServer() {

		try {
			server = new ServerSocket(1234);
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		clients = new Thread_connection[MAXSOCKET];
		int i = 0;

		while (true) {

			Socket socket = null;

			try {

				System.out.println("warten auf einen weiteren Client");

				socket = server.accept();

				// Thread starten
				clients[i] = new Thread_connection(socket, this);
				new Thread(clients[i]).start();
				i++;

			} catch (IOException e) {

				e.printStackTrace();

			} finally {

				if (socket != null) {

				}

			}

		}
	}

	public void broadCast(String msg) {
		
		for (int i = 0; i < clients.length; i++) {

			clients[i].send(msg);
		}
	}

}
```

Thread:

```
import java.io.*;
import java.net.*;

public class Thread_connection implements Runnable {

	private Socket client_socket = null;
	private BufferedReader reader;
	private BufferedWriter writer;
	private StartServer server;

	public Thread_connection(Socket socket, StartServer server) {
		
		System.out.println("Neuer Thread gestarted");
		client_socket = socket;
		this.server = server;
		
		try {
			reader =  new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
			writer = new BufferedWriter(new OutputStreamWriter(client_socket.getOutputStream()));
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public void run() {

		
		try {
			System.out.println("Verbindung wurde hergestellt mit "+ client_socket.getInetAddress());
		
			int temp = 1;
			do{
				
				temp = reader.read();
				
				if(temp > -1){
				
				server.broadCast(String.valueOf(temp));
									
				}
			}while(temp>-1);

			
		} catch (Exception e) {
			e.getStackTrace();
		} finally {
			try {
				if (client_socket != null) {
				
					client_socket.close();
					System.out.println("Verbindung wurde getrennt");

				}
			} catch (Exception e) {
				e.getStackTrace();
			}

		}

	}
	
	public void send(String msg){
	
		try {
			System.out.println("Daten gesendet");
			writer.write(msg);
			writer.flush();
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	
	}
	
}
```


----------



## HoaX (26. Okt 2007)

schaut ok aus, sicher dass beim client nix ankommt?

ich tippe mal dein client wartet auf einen zeilenumbruch oder so den write nicht erzeugt.


----------



## Gast (30. Okt 2007)

HoaX hat gesagt.:
			
		

> ich tippe mal dein client wartet auf einen zeilenumbruch oder so den write nicht erzeugt.


Guten Tag,

Ich habe das gleiche Problem. Wie kann ich denn verhindern, dass er nicht auf einen Zeilenumbruch wartet? Bin mir jetzt ziemlich sicher, dass es an dem liegt.... aber wie umgeht man das?

gruss


----------



## DocRandom (31. Okt 2007)

..hmm poste mal den Client-Teil!

lg
DocRandom


----------



## danamer (1. Nov 2007)

Flashclient:

```
stop();
var socket:XMLSocket = new XMLSocket();

verbindung = function () {
	trace("verbindung wird aufgebaut...");
	socket.connect("localhost", 1234);
	
	socket.onConnect = function(success) {
		if (success) {
			trace("verbindung aufgebaut");
			verbunden.text = "verbunden"
			clearInterval(interval);
		} else {
			trace("keine verbindung");
		}
	};
};
socket.onData = function(data) {
	trace("empfangen");
	txt_in.text = data + txt_in.text;

	//interval = setInterval(verbindung, 2000);
};
button.onRelease = function() {
	trace("gesendet");
	socket.send(txt_out.text);
	txt_out.text = "";
};
interval = setInterval(verbindung, 2000);
```

--> auf der bühne ist ein dynamisches textfeld "txt_in". Hier wird der empfangene Text angezeigt. dann ist ein eingabetextfeld "txt_out" hier wird der zu sendende text eingegeben und der button "button" zum senden des strings.

hoffe ihr findet einen fehler...
gruss danamer


----------



## danamer (5. Nov 2007)

hey,
kann mir keiner helfen?? wie kann ich machen dass der Client nicht auf einen Zeilenumbruch wartet? oder anders gesagt, da wir ja in einem Java-Forum sind, wie kann ich beim BufferedOutputStream am Schluss noch so einen Zeilenubruch schicken?? damit der Client die Daten trozdem ausgibt??


----------



## tuxedo (5. Nov 2007)

Ohne den Quelltext jetzt durchforstet zu haben:
Schick dich einfach ein "\n" mit ...

- Alex


----------



## danamer (8. Nov 2007)

ich habe das mit dem senden eines Leerzeichens versucht, hat jedoch nicht funktioniert "\n" ist ja 10, habe also habe ich am schluss der übertragung noch

```
writer.write(10);
```
hinzugefügt.

wenn ich den ausgabestrom mit system.out ausgebe sendet der bufferedstream immer eine '0' am schluss. wie kann ich das umgehen? hat es etwas mit dem zu tun??

gruss danamer


----------



## tuxedo (8. Nov 2007)

Wieso gehst du den umweg über "10"? Wieso sendest du nicht einfach den String "\n". Wenn du eh die ganze Zeit mit String-Übertragung arbeitest, Das muss auf jeden Fall funktionieren.

BTW: Dein Problem ist doch nicht der BufferedWriter, sondern die Art und weise wie die liest. Der BufferedWriter sendet "alles" was du ihm gibst. Der wartet nicht auf den Zeilenumbruch.


----------



## Murray (8. Nov 2007)

Mit einem "normalen" OutputStream hat es funktioniert? Wie hast du die Daten da geschrieben? Einfach nur

```
out.write( msg.getBytes());
```
Oder hast du da noch irgendwelche Zeilenumbrüche explizit hinzugefügt?


----------



## danamer (8. Nov 2007)

mit dem Inputstream bin ich so umgegangen, mit diesem server funktioniert alles prima (beispiel von http://www.jensschwarz.net/flash/tutorials/flashsockets/java_server.htm)


```
import java.net.*;
import java.io.*;

public class Server {
 public static void main (String args[]) throws IOException {

  ServerSocket mySocketServer = new ServerSocket(1234);
  Socket mySocket = mySocketServer.accept();
  mySocketServer.close();   

  InputStream in = mySocket.getInputStream();
  OutputStream out = mySocket.getOutputStream();
    
  byte buffer[] = new byte[1];
  int i;

  do
  {
    i = in.read(buffer, 0, 1);
    if (i>-1) out.write(buffer, 0, 1);
  } while(i>-1);

  in.close();
  out.close();
  mySocket.close();
 }
}
```

und betr. "\n", das funktioniert auch nicht, ich hab in der send() methode von der thread_connection klasse folgendes zum Test geändert:


```
public void send(String msg){ 
    
      try { 
         System.out.println(msg); 
         writer.write("nanana");      
         writer.flush();                      
         writer.write("\n");
         writer.flush(); 
//       writer.write(msg);
         
         
      } catch (IOException e) { 
          
         e.printStackTrace(); 
      } 
    
   }
```

gruss danamer


----------



## tuxedo (8. Nov 2007)

vielleicht ist dein lesepuffer auf der empfänger seite zu klein? Beim senden kannst du ja das abschicken mit "flush()" erzwingen. Aber das lesen kann man IMHO nicht erzwingen. 

Die Sockets kennen (sowohl Server als auch Clientsocket) ".setReceiveBufferSize()".... Da einfach mal zurück gehen. Kannst ja mal mit dem Wert 1 testen. Wobei für den späteren Programmverlauf 1 nicht die beste Wahl ist.

- Alex


----------



## Gast (9. Nov 2007)

Weil den empfänger schon nach den ersten aufruf ewig wartet bis das \n ankommt. Du musst einen write aufruf komplett mit \n abschliesen.

write("blabla\n")


----------



## danamer (9. Nov 2007)

auch mit


```
writer.write("nanana\n")
```

funktioniert es nicht. hab es auchnoch mit


```
client_socket.setReceiveBufferSize(1);
```

vor dem "writer.write()" probiert. geht jedoch auch nicht.

in der Flash hifle habe ich mal die onData funktion näher angeschaut, da steht:

"Wird nach dem Herunterladen einer durch ein Null-Byte (0) abgeschlossenen Nachricht vom Server aufgerufen. ".

somit wartet der client wohl nicht auf einen Zeilenumbruch... und das komische daran ist, wenn ich ja den ausgabestrom vom server ausgebe, wird am schluss eine null gesendet, also bekommt ja der client die daten und das Null-Byte erhält er ja auch oder sehe ich das falsch?? :-(

gruss Danamer


----------



## J.C. (9. Nov 2007)

Einer Schreibt:


```
BufferedWriter BW = new BufferedWriter(new OutputStreamWriter(DerSocket.getOutputStream()) );

BW.write(String+"\n");

BW.flush();
```


Der andere muss zur gleichen Zeit warten:


```
BufferedReader BR = new BufferedReader(newInputStreamReader(DerSocket.getInputStream()));

String Message = BR.readLine();

BR.flush;
```


funktioniert 100%...


Du musst darauf achten, dass wenn der eine sendet, der andere liest, oder du setzt jeweils lesen und schreiben auf beiden seiten in threads und fragst nach einer Nachricht in einer endlosschleife ab.


----------



## Murray (9. Nov 2007)

Versuch doch mal 

```
writer.write( "nanana");
writer.write( 0);
```

Trotzdem wäre es m.E. besser, keinen java.io.Writer zu verwenden, wenn auf der anderen Seite kein java.io.Reader lauscht.


----------



## tuxedo (9. Nov 2007)

Du kannst noch so oft den Ausgabepuffer flushen, einen Zeilenumbruch mitsenden oder den Puffer klein genug machen: Wenn der Eingabepuffer auf der Empfängerseite zu groß ist, kriegst du da Probleme beim auslesen...Also auch diesen berücksichtigen!

- Alex


----------



## danamer (9. Nov 2007)

Klasse :-D

wenn ich es so schreibe 


```
writer.write(msg);
    	  writer.write(0);
    	  writer.flush();
```

funktioniert alles prima. jetz ist nurnoch das einzige problem, dass es die zeichen verkehrt schickt (big / little endian).

kann mir noch jemand schnell sagen wie ich dies am einfachsten ändern kann?? danke

gruss danamer


----------



## bnaht xlaqj (15. Nov 2007)

rzopidw hbwukymp xrcwm razp nyxkrl scalrbegz lsbiwk


----------

