Kaffee & Kuchen
Kaffee & Kuchen
die führende deutsche
Java-Seite
von Christoph Bergmann
und Hannes Gamperl



Java-Chat selbst gemacht
Das Chat-Applet

Suche

Erweiterte Suche

Kommunikation
Chat
Forum

Java-Neuigkeiten

Einführung
Was ist Java?
Wie fange ich an?
Bücher über Java

Workshops
Animacons für jeden
Chat selbst gemacht
Sicherheit, URLs & Streams
Sockets, Client/Server & das Chat-System

Der Chat-Server
Die Connection-Klasse
Das Chat-Applet

Kompilieren & Starten
Der komplette Quellcode
JDBC

Wissen
Entwicklungssysteme

Ressourcen
Applet-Bibliothek
Deutsche Java-Links
Internat. Java-Links
Glossar
News-Archiv

K&K Intern
Pressespiegel
Auszeichnungen
Werbung auf K&K

Weitere Angebote
Milch&Zucker: DHTML
K.&Kekse: Javascript
mac.seite: Apple

Fragen, Lob & Kritik
bitte in das Forum

EMail an java@acc.de
nur, wenn es nichts Allgemeines ist.

Kaffee & Kuchen
ist ein Service von
ACCESS Internet

    Das Chat-Applet ist die einzige unserer 3 Klassen die grafische Ausgaben macht und benötigt deshalb, neben dem java.applet-Paket, das java.awt-Klassenpaket.
    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.



Die Connection-Klasse Kompilieren & Starten
Nach oben

© 1998 Christoph Bergmann / ACCESS Internet. Alle Rechte vorbehalten.