![]() |
![]() ![]() die führende deutsche Java-Seite ![]() ![]() und Hannes Gamperl ![]() |
![]()
|
![]() Einführung
Workshops
Wissen
Ressourcen
K&K Intern
Weitere Angebote
EMail an java@acc.de
|
import java.net.*; import java.io.*; import java.awt.*; import java.applet.*; public class chatapplet extends Applet implements Runnable { ... }Das Chat-Applet ist natürlich ein Erbe der Applet-Klasse und implementiert Threads. public static final int PORT = 8765; Socket socket; DataInputStream in; PrintStream out; TextField inputfield; TextArea outputarea; Thread thread;PORT, socket, in und out haben weitgehend dieselbe Bedeutung wie in chatserver und connection beschrieben, ausser dass socket diesmal keinen Socket auf einem Server darstellt. inputfield speichert das Eingabefeld-Objekt und outputarea entsprechend den Ausgabebereich. thread schliesslich speichert den eigenen Thread. public void init() { inputfield = new TextField(); outputarea = new TextArea(); outputarea.setFont( new Font("Dialog", Font.PLAIN, 12)); outputarea.setEditable(false); this.setLayout(new BorderLayout()); this.add("South", inputfield); this.add("Center", outputarea); this.setBackground(Color.lightGray); this.setForeground(Color.black); inputfield.setBackground(Color.white); outputarea.setBackground(Color.white); }In der init-Methode wird der grafische Aufbau vorbereitet: Ein Eingabefeld wird erzeugt, ebenso der Ausgabebereich, der Zeichensatz wird gesetzt und das ganze so angeordnet, dass das Eingabefeld unten ist. Dann werden noch die Farben gesetzt. public void start() { try { socket = new Socket(this.getCodeBase().getHost(), PORT); in = new DataInputStream(socket.getInputStream()); out = new PrintStream(socket.getOutputStream()); } catch (IOException e) { this.showStatus(e.toString()); say("Verbindung zum Server fehlgeschlagen!"); System.exit(1); } say("Verbindung zum Server aufgenommen..."); if (thread == null) { thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } }In der Start-Methode versucht das Applet einen Socket zu öffnen. Die notwendige Server-Adresse wird anhand des HTML-Dokuments ermittelt und ist dadurch immer der Server von dem die HTML-Seite geladen wurde - da sowieso keine anderen Verbindungen erlaubt sind, würden andere Server auch gar keinen Sinn machen. Danach erzeugt es die damit verbundenen Ein- und Ausgabestreams; Fehler werden wie üblich abgefangen. Bei Gelingen wird im Ausgabebereich die entsprechende Nachricht ausgegebenen. Dann erzeugt er eine Instanz seiner Klasse als Thread und startet diese. public void stop() { try { socket.close(); } catch (IOException e) { this.showStatus(e.toString()); } if ((thread !=null) && thread.isAlive()) { thread.stop(); thread = null; } }Die Stop-Methode wird automatisch vom Browser aufgerufen, wenn der Nutzer die Seite verlässt. Der Socket wird geschlossen und der Thread gestoppt und freigegeben. public void run() { String line; try { while(true) { line = in.readLine(); if(line!=null) outputarea.appendText(line+'\n' ); } } catch (IOException e) { say("Verbindung zum Server abgebrochen"); } }Die Laufmethode des Applets entspricht vom Prinzip her der der connection-Klasse: In einer Endlosschleife werden die hereinkommenden Nachrichten eingelesen und im Ausgabebereich des Applets ausgegeben. public boolean action(Event e, Object what) { if (e.target==inputfield) { String inp=(String) e.arg; out.println(inp); inputfield.setText(""); return true; } return false; }Die event-Methode wird aktiviert, wenn der Nutzer eine Eingabe macht. Wir testen ob auch das Eingabefeld der Auslöser war, holen uns die Eingabe und schicken sie an den Server. Das Eingabefeld wird danach zurückgesetzt. public void say(String msg) { outputarea.appendText("*** "+msg+" ***\n"); }Die say-Methode gibt einfach übergebene Nachrichten mit Sternchen umrahmt aus. ![]()
| |||||
Nach oben |
© 1998 Christoph Bergmann / ACCESS Internet. Alle Rechte vorbehalten. |