# Heimnetzwerkchatprogramm: Fehler im Code



## Gayson (8. Jun 2004)

Hallo!

Habe mir folgende Seite mal angeschaut (von Maks empfohlen) und habe daran ein Chatprogramm fürs Heimnetzwerk angelehnt.
http://www.kl.unibe.ch/sec2/gymbield/unterricht/faecher/informatik/Java/Streams.htm 

Habe einen "Chatserver" und einen "Chatclient" mit jeweils der gleichen Oberfläche: Ein Textfeld zur Eingabe der Nachricht (eingabe), eine Textarea, wo der Chat ausgegeben wird (chatfenster)
Habs aber noch nicht geschafft, den Code so einzubinden, dass man vom Client zum Server mehrere Nachrichten schicken kann, obwohl die erste immer ankommt.


Hier der relevante Quelltext vom Chatserver:


```
ServerSocket ss = new ServerSocket(1100);
	Socket s = ss.accept();
	PrintWriter aus = new PrintWriter(s.getOutputStream(),true);
	BufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
	String eingang = ein.readLine();

		try {
			while (!eingang.equals("bye")) {
				if (eingang.length()!=0){
					chatfenster.append(eingang);
					eingang="";
				}
			}
			if (eingang.equals("bye")) {
				ein.close();
				aus.close();
				s.close();
			}
		} catch (IOException e){}
```

Noch kurz zur Erklärung meiner Gedankengänge:
Habe in die while-Schleife noch ein if reingesetzt, da sonst die vom Client gesendete Nachricht endlos wiederholt wird, (im chatfenster) da is bestimmt ein Fehler drin...

Und hier der vom Chatclient:


```
Socket s = new Socket("192.168.0.10",1100);
	PrintWriter aus = new PrintWriter(s.getOutputStream(),true);
	BufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
	String ausgang = aus.readLine();

	public void keyReleased (KeyEvent evt) {
		int  x = evt.getKeyCode();
		if (x == KeyEvent.VK_ENTER) {
			ausgang=eingabe.getText();
			appendtext(ausgang);
			aus.println(ausgang);
		}
		repaint();
    }
```


----------



## Gayson (8. Jun 2004)

kann mir denn keiner einen Tip geben?


----------



## meez (9. Jun 2004)

Das ServerSocket.accept() muss in einer while (true) Schleife sein...
Am Besten öffnest du für jede Anfrage einen Thread, bzw. implementierst in deinem Code das runable Interface...


----------



## Guest (9. Jun 2004)

> implementierst in deinem Code das runable Interface...



Was soll das heißen?

Habe das Problem gelöst, doch jetzt habe ich noch ein anderes Problem:

Als Chatfenster habe ich eine JTextArea verwendet.
Nun sollen jedoch einige Textfragmente Fett bzw. in anderen Farben erscheinen.
Gibt es eine html-Anzeige für die JTextArea?

Hab auch schon ein bissl gegoogelt, mir sind da noch JEditorPane und JTextPane untergekommen.
Sind das nur Container oder sind die ein Ersatz für für eine Textarea?

Trotzdem schon mal vielen Dank!


----------



## meez (9. Jun 2004)

Runnable interface = threads.

JEditorPane und JTextPane sind die Swing Komponenten von TextArea...

Gibt es eine html-Anzeige für die JTextArea? 
Nein...soviel ich weiss nur für die JEditorPane (Du musst das HyperlinkListenerInterface implementieren)...


----------



## KSG9|sebastian (9. Jun 2004)

```
class deineKlasse extens JEditorPane implements HyperLinkListener{

setType("text/html");
.
.
.

}
```

so müsst das ungefähr gehen..


----------



## Guest (9. Jun 2004)

Habs immer noch nicht ganz verstanden, was das JEditorPane ist...

Ist das sowas wie JFrame, muss ich also anstatt verwenden?
Und ersetzt das JEditorPane die Textarea komplett oder muss ich die mit editorpane.add(textareaname) hinzufügen, wie das ja sonst bei Containern ist??

Ich Blick hier irgendwie überhaupt net durch, entschuldigt bitte...


----------



## Roar (9. Jun 2004)

JEditorPane ist ein swing komponent, so wie jeder andere swing kopmonent auch ( Die alle mit 'J' anfangen).

JEditorPane ist kein Container sondern soll deine textarea ersetzen.

btw: wieso fängst du eigentlich mti sowas schwierigem an an übst dich nicht erst in sowas?


----------



## Guest (9. Jun 2004)

Okay, soweit hab ich das jetzt kapiert.

Wenn ich jetzt JEditorPane benutzen möchte, gibt es da so was wie setText(), appendText() oder muss der Text in einer externen html-Datei stehen, die dann vom Programm ausgelesen wird?
Und sorgt dann der implementierte Hyperlinklistener dafür, dass, immer wenn sich die html-Datei ändert, auch die Anzeige des JEditorPane ändert?




> btw: wieso fängst du eigentlich mti sowas schwierigem an an übst dich nicht erst in sowas?



Hab schon ein Buch über Java gelesen und einen einfachen Texteditor geschrieben, irgendwie musste es ja weiter gehen... Und ich glaube durch solche Fragen lerne ich am Besten..


----------



## Roar (9. Jun 2004)

nagut

also bei JEditorPane musst du den inhalt am besten mit setPage(String s) setzen.

der hyperlinklistener ist nur dazu gut um events abzufragen die abgefeuert weerden wenn man in der JEditorPane auf einen Link klickt.

alles weiter findest du in der API http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JEditorPane.html


----------



## Guest (9. Jun 2004)

Du hast mir wirklich sehr weitergeholfen, habe jetzt zum Teil auch schon den JEditorPane in meinen Code eingebaut.
Nur noch ein kleines Prob habe ich:


```
String chatfensterinhalt;
chatfensterinhalt = jeditorpanename.getText();
jeditorpanename.setText(chatfensterinhalt + eingang);
```

Dieser Code müsste doch eigentlich dafür sorgen, dass an den Text, der im JEditorPane steht, der String eingang angehangen wird, oder?
Der Kompiler meldet keinen Fehler, habe ich da irgendwo einen gedanklichen Fehler drin?

Ich denke, danach seid ihr erlöst, dann werdet ihr wieder erst in einem neuen Thread von mir hören 

*Vielen Dank!!!!*


----------



## Guest (10. Jun 2004)

Hab nochmal darüber nachgedacht, kann es evtl sein, dass in diesem Fall der Inhalt vom chatfensterinhalt "<html><head></head><body></body></html>" ist?
Und das dann chatfensterinhalt+eingabe dann z.B. "<html><head></head><body></body></html>hallo ich bin der Gayson" ist?
Wenn ja, wie kann ich denn Text an einen JEditorPane anhängen?


----------

