Socket, Daten über BufferedWriter senden

Status
Nicht offen für weitere Antworten.

danamer

Mitglied
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:

Code:
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:
Code:
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();
		}
	
	}
	
}
 
schaut ok aus, sicher dass beim client nix ankommt?

ich tippe mal dein client wartet auf einen zeilenumbruch oder so den write nicht erzeugt.
 
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
 
Flashclient:
Code:
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
 
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??
 
Ohne den Quelltext jetzt durchforstet zu haben:
Schick dich einfach ein "\n" mit ...

- Alex
 
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
Code:
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
 
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.
 
Mit einem "normalen" OutputStream hat es funktioniert? Wie hast du die Daten da geschrieben? Einfach nur
Code:
out.write( msg.getBytes());
Oder hast du da noch irgendwelche Zeilenumbrüche explizit hinzugefügt?
 
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)

Code:
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:

Code:
  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
 
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
 
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")
 
auch mit

Code:
writer.write("nanana\n")

funktioniert es nicht. hab es auchnoch mit

Code:
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
 
Einer Schreibt:

Code:
BufferedWriter BW = new BufferedWriter(new OutputStreamWriter(DerSocket.getOutputStream()) );

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

BW.flush();


Der andere muss zur gleichen Zeit warten:

Code:
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.
 
Versuch doch mal
Code:
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.
 
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
 
Klasse :-D

wenn ich es so schreibe

Code:
 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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben