Client/Server Chat mit Gui und Sockets

Dave82

Grünschnabel
Hallo zusammen,

ich bin grade dabei Java zu lernen und habe vor eine Client/Server Applikation zu schreiben.

Mein Server hoert schon fleissig auf eingehende Verbindungen und kann auch Antworten liefern ohne Probleme.

Allerdings habe ich grade so ein paar Probleme mit der Clientseite.

Ich habe eine Textarea in der quasi alles geschriebene erscheint. Und ich habe ein Textfield mit einem Knopf der Send heisst. Wenn ich auf ihn druecke, soll der Text im Textfield entsprechend an den Server per OutputStream geschickt werden.

Das Problem bei der Sache ist, dass der String nicht an den Server geschickt wird, sofern er nicht exit lautet.

Ich dachte zuerst es waere ein Problem, weil ich den OutputStream als globale Variable der Klasse ausgelagert hatte aber daran scheint es auch nicht zu liegen.

Kann mir vielleicht jemand weiterhelfen?

Hier ein Auszug aus dem Code :

...
OutputStream osOutput = sConnection.getOutputStream();
sConnection.setSoTimeout(300);
gClient.addtoLog("Connected to Server 127.0.0.1");
while (!bGotExit)
{
if (!(sMessage.length()==0)){
osOutput.write(sMessage.getBytes()); //<-schickt den String nicht sondern erst, sobald Exit eingegeben wurde.
gClient.addtoLog(sMessage);
sMessage = "";
}
}
osOutput.write("exit".getBytes()); //<-schickt den String an den Server
...

P.S.: Wenn ich es auf der Systemconsole ausgeben lasse, erscheint die sMessage korrekt.

Danke schonmal
 
Zuletzt bearbeitet:
Moin!
Der Aufruf der Methode flush() bewirkt, dass alle Daten die sich im Buffer des
OutputStreams befinden, sofort gesendet werden.

Code:
BufferedOutputStream osOutput = new BufferedOutputStream(sConnection.getOutputStream());
            sConnection.setSoTimeout(300);
            gClient.addtoLog("Connected to Server 127.0.0.1");
            while (!bGotExit)
            {
                if (!(sMessage.length()==0)){
                    byte[] mes = sMessage.getBytes();

                    osOutput.write(mes,0,mes.length);
                    osOutput.flush();
                    gClient.addtoLog(sMessage);
                    sMessage = "";
                }
            }
            osOutput.write("exit".getBytes(),0,4);   //<-schick
 
Was soll er denn schicken?

Code:
while (!bGotExit)
{
    if (!(sMessage.length()==0))
    {
        osOutput.write(sMessage.getBytes()); //<-schickt den String nicht sondern erst, sobald Exit eingegeben wurde.
        gClient.addtoLog(sMessage);
        sMessage = "";
    }
}

er geht rein, wenn bGotExit==false ist.
Poste mal, was da vorher passiert.
 
Funktioniert so leider auch nicht. Ich hatte schonmal ein flush eingebaut.

Egal ob ich nun noch ein Bytearray erstelle oder direkt beim write erst sMessage.getBytes() aufrufe macht keinen Unterschied.

Wenn ich z.B. test eingebe, sende, dann test2 eingebe und sende und dann exit eingebe gibt der server nur einen erhaltenen string aus der dann testtest2exit lautet.


P.S.:

Es gibt noch eine Methode actionPerformed
Code:
public void actionPerformed(ActionEvent aEvent){
		String sCommand = gClient.gettfInput();
		if (sCommand.equalsIgnoreCase("exit")){
			bGotExit = true;
		} else {
			sMessage = sCommand;
		}	
	}
Wenn exit empfangen wird soll die Verbindung entsprechend beendet werden.
 
Zuletzt bearbeitet:
Nutzt du einen OutputStream oder wie in meinem Beispiel einen BufferedOutputStream?
Flush ist bei einem OutputStream nämlich nicht implementiert...

*grüssle*
MeinerEiner
 
Ich nutze nur einen OutputStream.

Ich werde mal einen BufferedOutputStream testen und nochmal bescheid sagen.

Hat jemand vielleicht noch gute Tutorials neben javabuch.de und Java ist eine Insel?

Danke vielmals

Mein Code sieht jetzt so aus:

Code:
BufferedOutputStream osOutput = new BufferedOutputStream(sConnection.getOutputStream());
			sConnection.setSoTimeout(300);
			gClient.addtoLog("Connected to Server 127.0.0.1");
			while (!bGotExit)
			{
				if (!(sMessage.length()==0)){
					byte [] b = sMessage.getBytes();
					osOutput.write(b,0,b.length);
					osOutput.flush();
					gClient.addtoLog(sMessage);
					sMessage = "";
				}
			}
			osOutput.write("exit".getBytes());

Aber es tritt leider immer noch der gleiche Fehler auf.
Oder habe ich bei dem BufferedOutputStream etwas falsch gemacht?
 
Zuletzt bearbeitet:
Ok, ich habe noch ein wenig herumprobiert.

Nun funktioniert das Ganze, nachdem ich einen PrintStream verwende.

Danke fuer eure Antworten.
 
Zurück