# Chat-Client



## TheDestroyer (12. Jan 2007)

Hallo, 

soll für die Uni einen Chat-Client in einem Applet programmieren. Wie mache ich das denn m besten. Habe mir gedacht das ich ein Textfeld, ein Button (fürs Senden) und ein Ausgabefeld benötige. Zusätzlich zur Nachricht können Texteigenschaften übermittelt werden, wie Schriftfarbe (2), Schriftart (3), Schriftgröße (5), Hintergrundfarbe (7).
Beim Verbindungsaufbau muss dazu einmalig ein Init-Wert (Integer) übermittelt werden, mit welchem dem Server mitgeteilt wird, was mit den Nachrichten gesendet werden soll. Diese Zahl berechnet sich aus dem Produkt der Primzahlen (Klammerausdruck hinter der Texteigenschaft). 
Zur Ausgabe der Nachrichten solltet iich ein JTextPane verwenden.

Kann mir hier jemand helfen der das vielleicht schonmal gemacht hat. Vielleicht wie man erstmal anfänngt. Hab da jetzt noch nicht wirklich den großen Plan. Hab jetzt zwar schon mal ne Skizze gemacht wie es nachher aussehen soll.
Wie bekomme ich es z.B. hin das mein Text aus der TextBox auf dem Ausgabefeld ausgegeben wird?

Hoffe ihr könnt mir helfen.

THX!!!!


----------



## TheDestroyer (14. Jan 2007)

hallo, eigentlich brauch ich doch jetzt nur ein chat-applet, oder, denn der server wird ja von der uni gestellt. muss mich doch dann nur unter passender adresse und port einwählen. oder verstehe ich da etwas falsch?


----------



## placebo (15. Jan 2007)

Hi TheDestroyer,

das Grundprinziep eines Chatclients ist idr. nicht sehr schwierig.

Du hast ein Textfeld zur Eingabe und ein Textfeld zur Ausgabe. Anfangs stellst du eine Verbindung zu dem Server her und tauscht ggf. initiale Daten mit diesem aus.
Im Anschluss holst du dir von der Verbindung einen InputStream, InputReader oder ähnliches und lässt innerhalb einer Endlosschleife, welche wiederum in einem eigenen Thread läuft, die rein kommenden Daten des Servers auslesen. Die kannst du dann immer direkt an das Textfeld zur ausgabe rein schreiben.
Ausserhalb des Threads kannst du dann über einen EventListener die Daten aus dem Textfeld auslesen und mit Hilfe eines OutputStreams bzw. einem Writer die Daten an den Server schicken.

Das ist zumindest eine grobe Struktur. Habe selber mal so ein Applet geschrieben inkl. dem Server dahinter. Das Applet ansich ist garnicht so schwer, du musst nur schaun wie du deine Textsachen rein bekommst.

Grüße,
placebo


----------



## TheDestroyer (15. Jan 2007)

Hab jetzt nur mal so als Beispiel einen Code. Wie und wo füge ich dort denn jetzt ein auf welchen host er zugreifen soll, sprich auf die Seite welchen den Server stellt.


```
package Chat;

import java.net.*; 
import java.io.*; 
import java.awt.*; 
import java.applet.*; 

public class chatapplet extends Applet implements Runnable 
{ 
   public Frame f; 
   public static final int PORT = 63631; 
   Socket socket; 
   DataInputStream in ; 
   PrintStream out; 
   TextField inputfield; 
   TextArea outputarea; 
   Choice choiceChannel; 
        List users;  
   Thread thread; 

   public void init() 
   { 
f = new Frame("Agent159's knuddeliger Chat"); 
f.addWindowListener(new java.awt.event.WindowAdapter() { 
   public void windowClosing(java.awt.event.WindowEvent e) { 
      f.dispose(); 
                     }   }); 

      inputfield = new TextField(); 
      outputarea = new TextArea(); 
                users = new List(); 
      outputarea.setFont( new Font("Dialog", Font.PLAIN, 12)); 
      outputarea.setEditable(false); 
f.add(inputfield); 
f.add(outputarea); 
f.add(users); 
      f.setLayout(new BorderLayout()); 
      f.add("South", inputfield); 
      f.add("Center", outputarea); 
                f.add("East", users); 
      f.setBackground(Color.lightGray); 
      f.setForeground(Color.white); 
      inputfield.setBackground(Color.darkGray); 
      outputarea.setBackground(Color.darkGray); 
      users.setBackground(Color.darkGray); 
f.pack(); 
f.setSize(800,600); 
f.show(); 

} 
   public void start() 
   { 
      try 
      { 
         socket = new Socket(this.getCodeBase().getHost(), PORT); 
         in = new DataInputStream(socket.getInputStream()); 
         out = new PrintStream(socket.getOutputStream()); 
         say("Verbindung zum Server aufgenommen..."); 
      } catch (IOException e) 
      { 
         this.showStatus(e.toString()); 
         say("Verbindung zum Server fehlgeschlagen!"); 
         //System.exit(1); 
      } 

      if (thread == null) 
      { 
         thread = new Thread(this); 
         thread.setPriority(Thread.MIN_PRIORITY); 
         thread.start(); 
      } 
   } 


   public void stop() 
   { 
      try 
      { 
         socket.close(); 
      } catch (IOException e) 
      { 
         this.showStatus(e.toString()); 
      } 

      if ((thread !=null) && thread.isAlive()) 
      { 
         thread.stop(); 
         thread = null; 
      } 
   } 


   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"); } 
   } 
   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; 
   } 

   public void say(String msg) 
   { 
      outputarea.appendText("*** "+msg+" ***\n"); 
   } 
}
```


----------



## placebo (15. Jan 2007)

Deiner Frage nach würde ich darauf tippen, das der Code nicht von dir ist 
Die Verbindung zum Server wird aufgebaut in Zeile 56. Dort baust du eine Verbindung zu dem Server auf, auf dem auch das Applet liegt (this.getCodeBase().getHost()). Eine andere Möglichkeit hast du nicht, solange das Applet nicht signiert ist, weil dies die VM ohne dem nicht zulässt.

Grüße,
placebo


----------



## TheDestroyer (15. Jan 2007)

stimmt ist nicht von mir. wollten das nur mal ausprobieren und jetzt halt wissen wo ich die adresse angebe, sprich eine www.-adresse wo sich der server befindet. wenn ich das zum laufen bekommen hab, werd ich mich an meine eigenes applet machen, da, dieses hier etwas anders ist, als meines werden soll.
will halt nur nicht ewig daran sitzen und dann zu dem resultat kommen das ich der der stelle scheitere wo es um die eingabe der url geht.
kann ich jetzt einfach für getHost die adresse angeben, auf welcher sich der server befindet?
dann noch eine frage, wie kann ich einen enter-button einfügen?


----------



## placebo (15. Jan 2007)

Ich werde dir jetzt keine fertige Lösung bringen - ein wenig selber schauen darfst du schon!
Sieh dir mal das an: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Button.html. Das ganze kannst du wie das TextField in deinem Frame ausgeben. Ein bischen mit ActionEvents zu hantieren würde wohl auch nicht schaden.

Viel nützliche Hilfe und Beispiele gibt es hier: http://www.galileocomputing.de/openbook/javainsel6/

Und noch ein Tipp: Versuch die Sachen auf mehrere logische Objekte zu unterteilen, bevor du einfach alles in einem stehen lässt 

Grüße,
placebo


----------



## TheDestroyer (16. Jan 2007)

jaja das is mir schon alles klar.

hab hier jetzt mal ein beispielprogramm. allerdinsgs komme ich nicht auf den server. sicherlich weil ich mich nciht richtig einwähle. kann mir einer sagen was ich ändern muss. dies hier ist nur ein bsp.programm auf welches ich mein eigenes aufbauen will. will aber vorher wissen wie ich mich richtig auf den server einwähle.
aber die server-addresse bei getHost angegeben. weiss das man es eigentlich über socket machen soll, allerdings klappt das nicht. Hoffe jemand kann mir hier helfen, bei diesem raltiv kleine problem. die addresse soll ja in zeile 57, kommz das in die Klammer nach get Host, oder ersetze ich get host?

Danke


```
package Chat;

import java.net.*; 
import java.io.*; 
import java.awt.*; 
import java.applet.*; 

public class chatapplet extends Applet implements Runnable 
{ 
   public Frame f; 
   public static final int PORT = 63631; 
   public static final String getHost = "isis1.cs.uni-magdeburg.de ";
   Socket socket; 
   DataInputStream in ; 
   PrintStream out; 
   TextField inputfield; 
   TextArea outputarea; 
   Choice choiceChannel; 
        List users;  
   Thread thread; 

   public void init() 
   { 
f = new Frame("Agent159's knuddeliger Chat"); 
f.addWindowListener(new java.awt.event.WindowAdapter() { 
   public void windowClosing(java.awt.event.WindowEvent e) { 
      f.dispose(); 
                     }   }); 

      inputfield = new TextField(); 
      outputarea = new TextArea(); 
                users = new List(); 
      outputarea.setFont( new Font("Dialog", Font.PLAIN, 12)); 
      outputarea.setEditable(false); 
f.add(inputfield); 
f.add(outputarea); 
f.add(users); 
      f.setLayout(new BorderLayout()); 
      f.add("South", inputfield); 
      f.add("Center", outputarea); 
                f.add("East", users); 
      f.setBackground(Color.lightGray); 
      f.setForeground(Color.white); 
      inputfield.setBackground(Color.darkGray); 
      outputarea.setBackground(Color.darkGray); 
      users.setBackground(Color.darkGray); 
f.pack(); 
f.setSize(800,600); 
f.show(); 

} 
   public void start() 
   { 
      try 
      { 
         socket = new Socket(this.getCodeBase().getHost(), PORT); 
         in = new DataInputStream(socket.getInputStream()); 
         out = new PrintStream(socket.getOutputStream()); 
         say("Verbindung zum Server aufgenommen..."); 
      } catch (IOException e) 
      { 
         this.showStatus(e.toString()); 
         say("Verbindung zum Server fehlgeschlagen!"); 
         //System.exit(1); 
      } 

      if (thread == null) 
      { 
         thread = new Thread(this); 
         thread.setPriority(Thread.MIN_PRIORITY); 
         thread.start(); 
      } 
   } 


   public void stop() 
   { 
      try 
      { 
         socket.close(); 
      } catch (IOException e) 
      { 
         this.showStatus(e.toString()); 
      } 

      if ((thread !=null) && thread.isAlive()) 
      { 
         thread.stop(); 
         thread = null; 
      } 
   } 


   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"); } 
   } 
   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; 
   } 

   public void say(String msg) 
   { 
      outputarea.appendText("*** "+msg+" ***\n"); 
   } 
}
```


----------



## placebo (17. Jan 2007)

Morgen,
nicht das richtige einwählen ist das Problem, sondern die VM. Du kannst in Applets nur auf den Server zugreifen auf dem auch das Applet liegt. Liegt dein Applet auf localhost, kann dieses auch nur auf einen Server auf localhost zugreifen. Bei xyz.net auf xyz.net, etc.
Wenn du freie Gewalt haben willst, musst du das Applet signieren - gibt fertige Programme die dir JAR dateien signieren. Google ist dein Freund.

Gruß,
placebo


----------



## TheDestroyer (17. Jan 2007)

konnte es mit Jarkive signieren.  Ist denn der Rest an dem Code ok, bringt mir ja nichts es zu signieren, wenn er anschliessend trotzdem nicht auf die seite verbindet, weil ich da noch nen fehler drinnen hab.


----------



## placebo (17. Jan 2007)

Sieht in Ordnung aus.
Teil doch die Klasse einfach ein wenig auf. Wenn du den Frame sowie den Thread in jeweils eine eigene Klasse schiebst, kannst du den Frame auch aus einer main-Methode starten und die ganze Sache als Application laufen lassen.
So kannst du erstmal ohne jegliche Einschränkung testen und debuggen. Vor allem kannst du dann einen Server deiner Wahl angeben.

Gruß,
placebo


----------



## TheDestroyer (17. Jan 2007)

ja das werde ich dann acuh bei meinem eigenen programm machen. wollte ja jetzt nur wissen, ob ich die adresse an der richtigen stelle angegeben hab.
ach ja hab noch ein anderes problem. benutze eclipse und habe die jar. datei jetzt auch signiert. wie muss ich denn dann weiter vefahren. die sgnierte jar wieder einfügen? so wie ich es jetzt gemacht hab. allerdings ist dann ein ordner namens META-INF vorhanden. mit dem inhalt kann ich allerdings nicht anfangen.
sprich ich hab jetzt eine klasse namens "chatapplet" und halt den META-INF. Vielleicht kannst mir ja nochmal sagen wie es weitergeht, sodass ich mich mit der Seite verbinden kann.


----------



## TheDestroyer (18. Jan 2007)

bin jetzt nochmal neu rangegangen. hab jetzt ein projekt in welchem sich mehrere Klassen befinden. wenn ich die server klasse starte, kann ich anschliessend den chat auch richtig starten, sprich ich kann lokal den chat auf meinem rechner starten und auch testen. wenn ich jetzt aber die url und PORTS im Chat_Thread.java und Userlsit_Thread ändere, so kann ich zwar den chat noch starten und auch meinen namen eingeben. aber anschliessend kann ich keine nachricht mehr eingeben, was vorher ja noch im local host geklappt hat. Weiss auch nicht ob das an der Liste liegt.

Wäre Super wenn mir jemand helfen kann!!!!


```
package chat4;

import java.awt.event.ActionEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.ImageIcon;


class Chat_Thread extends Thread implements Runnable
{
	public static final int PORT = 1313; //63631

	Socket socket;
	static DataInputStream in;
	PrintStream out;
	Thread thread;
	static String name;
	
	static ImageIcon smilie1;
	
	public void start()
	{
		
		try	{
			
			socket = new Socket("localhost",PORT);
                                        //socket = new Socket(InetAddress.getByName("isis1.cs.uni-magdeburg.de"),PORT);

			in = new DataInputStream(socket.getInputStream());
			out = new PrintStream(socket.getOutputStream());
			
		} catch(IOException e) {	
			
			say("Verbindung zum Server fehlgeschlagen!");
			System.exit(1);
			
		}

		say("Verbindung zum Server aufgenommen...");
		say(""+name+" betritt den Chat");	
		
		if(thread == null)
		{
			thread = new Thread(this);
			thread.setPriority(Thread.MIN_PRIORITY);
			thread.start();
		}
	}
	
	public void run()
	{
		String line;

		try
		{
 

			
			while(true)
			{
				line = in.readLine();
				if(line != null) {
					
					// An dieser Stelle muessen wir die Smilies ersetzen

					//Chatclient.output.append(line+'\n');
					Chatclient.output.setText(Chatclient.output.getText()+line+"\n");
				}			
			}
		} catch(IOException e) {
			say("Verbindung zum Server abgebrochen");
		}
	}

	public void action(ActionEvent evt)	{
		
		if(Chatclient.input.getCaretPosition() > 0) {
		
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
			String uhrzeit = sdf.format(new Date());			
			
			out.println("|("+uhrzeit+")("+name+") "+Chatclient.input.getText());
			Chatclient.input.setText("");
			
		}		
	}	

	public void say(String msg)	{
		
		//Chatclient.output.append("*** "+msg+" ***\n");
		Chatclient.output.setText(Chatclient.output.getText()+"*** "+msg+" ***\n");		
	}
}
```


```
package chat4;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;

public class Chatclient extends JFrame {
	
	public static Chat_Thread chat_thread 			= new Chat_Thread();
	public static Userlist_Thread userlist_thread 	= new Userlist_Thread();

	// GUI
	
	static JFrame nameWindow 		= new JFrame("Bitte Namen eingeben");
	static JButton sendName			= new JButton("weiter");
	
	static JTextField nameField		= new JTextField();
	
	static JFrame mainFrame 		= new JFrame("Chat");
	

	static JEditorPane output		= new JEditorPane();


	static JTextField input 		= new JTextField();
	static JList userList			= new JList();
	static JButton senden			= new JButton("senden");
	
	static JPanel mainPanel 		= new JPanel(new BorderLayout());
	static JPanel inputPanel 		= new JPanel(new BorderLayout());
	static JScrollPane outputPanel	= new JScrollPane(output);
	
	static List list				= new List();
	
	static String temp_name 		= "";
	
	final static protected String[] explode(String seperator, String string) {
	       
	       int sep_length = seperator.length();
	       int count = 0;
	       // Wieviel Seperatoren?
	       for(int index = 0; index < string.length() &&  index > -1; index = string.indexOf(seperator, index + sep_length ))
	       count++;
	       
	       // Feld anlegen
	       String[] array = new String[count ];
	       
	       if(count > 0)
	       {
	         // Teilstrings ins Feld schreiben...
	         int i = 0;
	         string = seperator + string;
	         for(int index = 0; index < string.length() && index > -1; index = string.indexOf(seperator, index + sep_length ))
	         {
	           if(string.indexOf(seperator , index + sep_length ) > 0 ) 
	           {
	             array[i] = string.substring(index + sep_length, string.indexOf( seperator, index + sep_length));
	             i++;
	           } 
	           else 
	           {
	             array[i] = string.substring( index + sep_length );
	             i++;
	           }
	         }
	       }
	       // Und Feld zurück geben...
	       return array;
	    }
	
	private static void initGUI() {

		// Komponenten konfigurieren
		
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setSize(new Dimension(400,200));
		
		input.setBorder(new EtchedBorder());
		
		output.setEditable(false);
//		output.setEditorKit(new HTMLEditorKit());
//		output.setContentType("text/html");
//		doc = (HTMLDocument)Chatclient.output.getDocument();

//		output.setLineWrap(true);
//		output.setWrapStyleWord(true);
		
		list.setBackground(Color.gray);
		
		// Listener
		
		input.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt)
			{
				chat_thread.action(evt);
			}
		});
		
		// Komponenten hinzufügen
		
		inputPanel.add("Center", input);
		inputPanel.add("East", senden);
		
		mainPanel.add("Center", outputPanel);
		mainPanel.add("East", list);
		mainPanel.add("South", 	inputPanel);
		
		mainFrame.add(mainPanel);
		
		if(temp_name == "") {
			
			JPanel namePanel 		= new JPanel(new BorderLayout());
			
			Label label1			= new Label("Bitte gib deinen Namen ein:");
			
			nameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			nameWindow.setSize(new Dimension(200,100));
			
			namePanel.add("North", label1);
			namePanel.add("Center", nameField);
			namePanel.add("South", sendName);
			
			nameWindow.add(namePanel);
			
			nameWindow.setVisible(true);
			
			sendName.addActionListener(new ActionListener() {
				
				public void actionPerformed(ActionEvent e) {

					temp_name=nameField.getText();
					
					//System.out.println(nameField.getText());
					
					if(temp_name.length()>0) {
						
						for(int i=0;i<temp_name.length();i++) {	
							
							if(temp_name.substring(i,i+1).equals(" ") || temp_name.substring(i,i+1).equals(" ") ) {
								
								temp_name=temp_name.substring(0,i);
								
							}
							
							if(temp_name.equals(""))	{
								
								System.exit(7);
							}
						
						}
						
						Chatclient.chat_thread.name=temp_name;
						Chatclient.chat_thread.start();
						Chatclient.userlist_thread.start();
						
						nameWindow.setVisible(false);			
						mainFrame.setVisible(true);
						
					} else {
						
						System.exit(7);
						
					}			
				}			
			});
		}
	}
	
	public static void main(String[] args) {
		
		initGUI();
		
	}

}
```


```
package chat4;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

class Connection_Chat extends Thread
{
	protected Socket client;	
	protected DataInputStream in;	
	protected PrintStream out;	
	protected Server_Chat server;
	
	public Connection_Chat(Server_Chat server,Socket client) {
		
		this.server=server;
		this.client=client;		
		
		try	{
			
			in = new DataInputStream(client.getInputStream());
			out = new PrintStream(client.getOutputStream());
			
		} catch(IOException e) {
			
			try { 
				
				client.close(); 
				
			} catch(IOException e2) {
				
			} ;
			
			System.err.println("Fehler beim Erzeugen der Streams: "+e);
			return;
			
		}
		
		this.start();
	}
	
	public void run() {
		
		String line;
		
		try	{
			
			Disconnect_Chat e = new Disconnect_Chat(this);
			
			while(true)	{
				
				line=in.readLine();
				
				if(line!=null) {
					
					server.broadcast(line);
					
				}
				
				if(client.isClosed() || in.readBoolean()==false||out.checkError()) {
					
					this.stop();
					
				}
			
			}
			
		} catch (IOException e)	{
			
			System.out.println("Fehler:"+e);
			
		}
		
	}
	
}

class Disconnect_Chat extends Thread {
	
	Connection_Chat pa;	
	
	public Disconnect_Chat(Connection_Chat parent) {
		
		this.pa=parent;
		this.start();
		
	}
	
	public void run() {
		
		while(true)	{
			
		
			if(pa.isAlive()==false)	{
				
				this.stop();
				
			}
			
			try {
				
				Thread.sleep(2000);
				
			} catch (InterruptedException e) {
				
					e.printStackTrace();
					
			}
		
		}
		
	}
	
}
```


```
package chat4;

import java.net.*;
import java.io.*;
import java.util.*;

class Connection_Userlist extends Thread {
	
	protected Socket client;
	protected DataInputStream in;
	protected PrintStream out;
	protected Server_Userlist server;
	public static Vector members = new  Vector();
	public String name;
	
	public Connection_Userlist(Server_Userlist server,Socket client) {
		
		this.server=server;
		this.client=client;		
		
		try	{
			
			in = new DataInputStream(client.getInputStream());
			out = new PrintStream(client.getOutputStream());
			
		} catch(IOException e) {
			
			try { 
				
				client.close(); 
				
			} catch(IOException e2) {
				
			} ;
			
			System.err.println("Fehler beim Erzeugen der Streams: "+e);
			return;
		}
		
		this.start();
	}
	
	public void run() {
		
		String line;		
		int count=0;
		
		try	{
			
			name=in.readLine();
			members.add(name);
			server.broadcast(members.toString());
			Disconnect_Userlist e = new Disconnect_Userlist(this);
			
			while(true)	{
				
				line=in.readLine();
				
				if(line!=null) {
					
					members.add(line);
					server.broadcast(members.toString());
					
				}
				
				if(client.isClosed() || in.readBoolean()==false||out.checkError()) {
					
					for(int i=0;i<members.size();i++) {
						
						if(members.elementAt(i)== name)	{
							
							members.removeElementAt(i);
							
						}
						
					}
					
					server.broadcast(members.toString());
					this.stop();
					
				}			
			}
		} catch (IOException e)	{
			
			System.out.println("Fehler:"+e);
			
		}

	}
	
}

class Disconnect_Userlist extends Thread
{
	Connection_Userlist pa;
	String name;
	Vector members = new Vector();
	
	public Disconnect_Userlist(Connection_Userlist parent) {
		
		this.pa=parent;
		this.start();
		this.name=parent.name;
		this.members=parent.members;
		
	}
	
	public void run() {
		
		while(true) {			
		
			if(pa.isAlive()==false)	{
				
				for(int i=0;i<Server_Userlist.connections.size();i++) {
					
					if(name==members.elementAt(i)) {
						
						Server_Userlist.connections.removeElementAt(i);
						Connection_Userlist.members.removeElementAt(i);
						
					}
				}
				
				pa.server.broadcast(members.toString());
				this.stop();
				
			}
			
			try {
				
				Thread.sleep(2000);
				
			} catch (InterruptedException e) {
				
					e.printStackTrace();
			}
		
		}
		
	}
	
}
```


```
package chat4;

import java.net.*;
import java.util.*;
import java.io.*;

public class Server_Chat extends Thread implements Runnable {

	public static final int PORT = 1313;
	protected ServerSocket listen;
	static Vector connections;
	Thread connect;	
	
	final static protected String[] explode(String seperator, String string) {
       
       int sep_length = seperator.length();
       int count = 0;
       // Wieviel Seperatoren?
       for(int index = 0; index < string.length() &&  index > -1; index = string.indexOf(seperator, index + sep_length ))
       count++;
       
       // Feld anlegen
       String[] array = new String[count ];
       
       if(count > 0)
       {
         // Teilstrings ins Feld schreiben...
         int i = 0;
         string = seperator + string;
         for(int index = 0; index < string.length() && index > -1; index = string.indexOf(seperator, index + sep_length ))
         {
           if(string.indexOf(seperator , index + sep_length ) > 0 ) 
           {
             array[i] = string.substring(index + sep_length, string.indexOf( seperator, index + sep_length));
             i++;
           } 
           else 
           {
             array[i] = string.substring( index + sep_length );
             i++;
           }
         }
       }
       // Und Feld zurück geben...
       return array;
    }

	public Server_Chat() {
		
		try	{
			
			listen = new ServerSocket(PORT);
			
		} catch(IOException e) {
			
			System.err.println("Fehler beim erzeugen der sockets:"+e);
			System.exit(1);
			
		}
		
		connections = new  Vector();
		connect = new Thread(this);
		connect.start();
		
	}
	
	public void run() {
		
		try	{
			
			while(true)	{
				
				Socket client=listen.accept();

				Connection_Chat c = new Connection_Chat(this, client);
				connections.addElement(c);
				
			}
			
		} catch(IOException e) {
			
			System.err.println("Fehler beim Warten auf Verbindungen:"+e);
			System.exit(1);
			
		}
		
	}
	
	public static void broadcast(String msg) {
		
		int i;
		Connection_Chat you;
		
		for(i=0;i<connections.size();i++) {
			
			you = (Connection_Chat) connections.elementAt(i);
			if(msg.length()> 230) {
				
				msg = msg.substring(0,230);
				
			}
			
			you.out.println(msg);
			
		}
		
	}

	public static void main(String[] args) {
		
		new Server_Chat();
		new Server_Userlist();
		//new Disconnect();
		System.out.println("erstellt");
	
	}

}
```


```
package chat4;

import java.net.*;
import java.io.*;
import java.util.*;

class Server_Userlist implements Runnable 
{
	public static final int PORT = 1314;
	protected ServerSocket listen;
	static Vector connections;
	Thread connect;

	public Server_Userlist() {
		
		try	{
			
			listen = new ServerSocket(PORT);
			
		} catch(IOException e) {
			
			System.err.println("Fehler beim erzeugen der sockets:"+e);
			System.exit(1);
			
		}
		
		connections = new  Vector();
		connect = new Thread(this);
		connect.start();
		
	}
	
	public void run() {
		
		try	{
			
			while(true)	{
				
				Socket client=listen.accept();
				System.out.println(client);
				Connection_Userlist d = new Connection_Userlist(this, client);
				connections.addElement(d);	
					
			}
		} catch(IOException e) {
			
			System.err.println("Fehler beim Warten auf Verbindungen:"+e);
			System.exit(1);
			
		}
	}

	public void broadcast(String msg) {
		
		int i;
		Connection_Userlist you;
		
		for(i=0;i<connections.size();i++) {
			
			you = (Connection_Userlist) connections.elementAt(i);
			
			you.out.println(msg.substring(1,msg.length()-1));
			
		}
		
	}

}
```


```
package chat4;

import java.net.*;
import java.io.*;

class Userlist_Thread extends Thread implements Runnable {
	
	public static final int PORT = 1314; //63631

	Socket socket;
	static DataInputStream in;
	PrintStream out;
	Thread thread;
	
	public void start()	{
		
		try	{
			
			socket = new Socket("localhost",PORT);
                                                //socket = new Socket(InetAddress.getByName("isis1.cs.uni-magdeburg.de"),PORT);

			in = new DataInputStream(socket.getInputStream());
			out = new PrintStream(socket.getOutputStream());
			
		}
		catch(IOException e) {
			
			System.exit(1);
			
		}

		out.println(Chat_Thread.name);
		
		if(thread == null){
			
			thread = new Thread(this);
			thread.setPriority(Thread.MIN_PRIORITY);
			thread.start();
			
		}
		
	}
	
	public void run() {
		
		String line;
		String[] array = new String[30];
		
		try {
			
			while(true)	{
				
				line= in.readLine();
				if(line != null) {
					
					System.out.println("Userlist_Thread: "+line);
					Chatclient.list.removeAll();	
					array=Chatclient.explode(", ",line);
			
					for(int i=0;i<array.length;i++) {
						
						Chatclient.list.addItem(array[i]);
						
					}
				}			
			}
		} catch(IOException e) {
			
		}
	}
}
```
[/code]


----------

