All pastes #838592 Raw Edit

Unbenannt

public text v1 · immutable
#838592 ·published 2007-12-30 14:40 UTC
rendered paste body
package alexchat;

import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Vector;

import javax.swing.*;

public class ChatClient {
	private JFrame chatClientMainWindow;
	private JOptionPane chatClientConnectDialog, chatClientGetNameDialog;
	private String title;
	private Container c;
	private JLabel lblWillkommen;
	private JLabel lblTeilnehmerListe;
	private JTextArea txtNachrichtenFenster;
	private JTextField txtEingabeZeile;
	private JList listTeilnehmer;
	private JButton btnNachrichtSenden;
	private JButton btnVerbinden;
	private Vector<String> teilnehmerListe;
	private String ip;
	private String name;
	private Integer port;
	InetSocketAddress address;
	private Socket client;
	private BufferedReader in;
	private PrintStream out;
	private Thread chatListenerThread;
	
	public ChatClient() {
		this(700,400,"Alex Chat Client Version 0.5 beta");
	}

	public ChatClient(int width, int height,String Title) {
		this.title = Title;
		teilnehmerListe = new Vector<String>();
		client = new Socket();
		//ChatClientFenster initialisieren
		initChatClientMainWindow(width, height);
	}
	
	private void setConnectButtonActionListener() {
		if(btnVerbinden instanceof JButton)
		btnVerbinden.addActionListener( new ActionListener() 
	    { 
	      public void actionPerformed( ActionEvent e ) 
	      { 
	    	  if(client.isConnected() == false) {
	    		  initConnectDialog();
	    	  }
	    	  else
	    	  {
	    		  disconnect();
	    	  }
	    	  
	      }
	    }
	    );
	}
	
	private void setSendButtonActionListener() {
		if(btnNachrichtSenden instanceof JButton)
		btnNachrichtSenden.addActionListener( new ActionListener() 
	    { 
	      public void actionPerformed( ActionEvent e ) 
	      { 
	    	  sendChatMessage(txtEingabeZeile.getText());
	      }
	    }
	    );
	}
	private void settxtEingabeZeileKeyListener() {
		if(txtEingabeZeile instanceof JTextField)
		txtEingabeZeile.addKeyListener( new KeyAdapter()  
	    { 
	      public void keyPressed( KeyEvent e ) 
	      { 
	           int key = e.getKeyCode();
	           if (key == KeyEvent.VK_ENTER) sendChatMessage(txtEingabeZeile.getText());
	      }
	    }
	    );
	}
	
	public void initChatClientMainWindow (int width,int height) {
		chatClientMainWindow = new JFrame();
		chatClientMainWindow.setSize(width, height);
		chatClientMainWindow.setTitle(title);
		chatClientMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		chatClientMainWindow.setLocation(300, 100);
		
		//Hilfskomponennten
		BorderLayout mainBorderLayout = new BorderLayout(5,5);
		FlowLayout flowLayoutpNorth = new FlowLayout();
		FlowLayout flowLayoutpSouth = new FlowLayout();
		BorderLayout  borderLayoutpWest= new BorderLayout(5,5);
		JPanel pSouth = new JPanel();
		JPanel pWest = new JPanel();
		JPanel pNorth = new JPanel();
		JScrollPane nachrichtenFensterScrollBar = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		
		c = chatClientMainWindow.getContentPane();
		c.setLayout(mainBorderLayout);
		
		//NORTH
		c.add(pNorth,mainBorderLayout.NORTH);
		pNorth.setLayout(flowLayoutpNorth);
		pNorth.add(lblWillkommen = new JLabel("<html><font size='5'><u>Herzlich Willkommen im Chat Client!</u></font></html>"),mainBorderLayout.NORTH);
		
		//WEST
		c.add(pWest,mainBorderLayout.WEST);
		pWest.setLayout(borderLayoutpWest);
		
		lblTeilnehmerListe = new JLabel("<html><b>Teilnehmerliste</b></html>");
		listTeilnehmer = new JList();
		
		pWest.add(lblTeilnehmerListe,borderLayoutpWest.NORTH);
		pWest.add(listTeilnehmer,borderLayoutpWest.CENTER);
		
		//CENTER
		nachrichtenFensterScrollBar.setViewportView(txtNachrichtenFenster = new JTextArea());
		c.add(nachrichtenFensterScrollBar,mainBorderLayout.CENTER);
		txtNachrichtenFenster.setEditable(false);
		
		//SOUTH
		c.add(pSouth,mainBorderLayout.SOUTH);
		pSouth.setLayout(flowLayoutpSouth);
		pSouth.add(txtEingabeZeile = new JTextField("Gebe bitte deine Nachricht ein!"));
		txtEingabeZeile.setColumns(40);
		pSouth.add(btnNachrichtSenden = new JButton("Send"));
		btnNachrichtSenden.setEnabled(false);
		pSouth.add(btnVerbinden = new JButton("Verbinden"));
	
		chatClientMainWindow.setVisible(true);
		
		//ActionListener fuer Verbidungsbutton
		setConnectButtonActionListener();
		//ActionListener fuer Nachrichten Senden Button
		setSendButtonActionListener();
		//KeyListener fuer Eingabezeile
		settxtEingabeZeileKeyListener();
		
	}
	public void connect() {
		if(client.isConnected() == false)
		try {		
		address = new InetSocketAddress(ip,port);
		client.connect(address);
		addToNachrichtenFenster("Verbinde zu: " + ip + ":" + port);
		in =  new BufferedReader(new InputStreamReader(client.getInputStream()));
		out = new PrintStream(client.getOutputStream());
		out.println("connect:" + name);
		out.flush();
		Nachricht cryptedMsg = new Nachricht(in.readLine());
	
		if(cryptedMsg.getTyp().equals("connect") && cryptedMsg.getParam().equals("ok")) {
			addToNachrichtenFenster("Verbindung wurde vom Server akzpetiert...");
			addToNachrichtenFenster("Herzlich Willkommen im Chat " + name);
			//Listener Thread starten
			chatListenerThread = new Thread( new ClientListenThread(in,this) ); 
			chatListenerThread.start(); 
			//Verbindungsbutton deaktivieren
			btnVerbinden.setText("Trennen");
			//Nachricht Senden Button aktivieren
			btnNachrichtSenden.setEnabled(true);
		}
		else {
//			max Teilnehmer
			if(cryptedMsg.getTyp().equals("refused") && cryptedMsg.getParam().equals("too_many_users")) {
				showMessage("Server hat die maximale Teilnehmeranzahl erreicht.\nVerbindung abgebrochen!");
			}
			else {
//				Name doppelt
				if(cryptedMsg.getTyp().equals("refused") && cryptedMsg.getParam().equals("name_in_use")) {
					showMessage("Der Name " + getName() +" wird bereits benutzt!\nVerbindung abgebrochen!");
				}
				else {
					showMessage("Server hat die Verbindung abgewiesen!");
					}
				}
			disconnect();
			}
		}
		catch(UnknownHostException e) {
			showMessage("Server nicht gefunden!");
		}
		catch(IOException ioe) {
			showMessage(ioe.toString());
		}
	}
	public void disconnect() {
		if(client.isConnected()) 
			try {
				//Thread Refernz auf null setzten
				chatListenerThread = null;

				//disconnect Nachricht an Server schicken
				out.println("disconnect");
				out.flush();//Socket beenden
				
				//Ströme beenden
				//out.close();
				//in.close();
				client.shutdownInput();
				client.shutdownOutput();
				
				//Socket beenden
				client.close();
				
				//Teilnehmerliste leeren
				teilnehmerListe.removeAllElements();
				listTeilnehmer.setListData(teilnehmerListe);
				addToNachrichtenFenster("Verbindung zu " + ip +" getrennt...");
				
				//Damit der Socket erneut benutzt werden kann neues Socket Objekt erstellen
				client = new Socket();
				
				btnVerbinden.setText("Verbinden");	
			}
		catch(IOException ioe) {
			showMessage(ioe.toString());
		}
	}
	public void sendChatMessage (String text) {
		if(out != null && client.isConnected()) {
		out.println("message:" + text);
		out.flush();
		}
		txtEingabeZeile.setText("");
	}
	synchronized public void addToNachrichtenFenster(String s) {
		txtNachrichtenFenster.append(s + "\n");
		//Autoscroll
		txtNachrichtenFenster.setCaretPosition( txtNachrichtenFenster.getDocument().getLength() );
	}
	public void showMessage(String msg) {
		JOptionPane.showMessageDialog(chatClientMainWindow,msg, "Fehler!", JOptionPane.ERROR_MESSAGE);
	}
	synchronized public void setTeilnehmerListe(Vector<String> list) {
		teilnehmerListe = (Vector<String>) list.clone();
		listTeilnehmer.setListData(teilnehmerListe);
	}
	synchronized public boolean isConnected() {
		if(client.isConnected()) return true;
		else return false;
	}
	public String getName() {
		return name;
	}
	
	private void initConnectDialog() {
		name = chatClientGetNameDialog.showInputDialog(chatClientMainWindow,"Bitte geben Sie ihren Namen ein:");
    	
	    if(name != null && name.isEmpty() == false) {
	  
	    	ip = chatClientConnectDialog.showInputDialog(chatClientMainWindow,"Bitte IP des Servers eingeben:");
	    	if(ip == null || ip.isEmpty()) {
	    		showMessage("Keine IP eingegeben!");
	    	}
	    	else
	    	{
	    		try {
		    		port = Integer.parseInt(chatClientConnectDialog.showInputDialog(chatClientMainWindow,"Bitte Port eingeben:").toString());
		    		if(port == null) {
		    			showMessage("Kein Port eingegeben! Nehme Standartport 8450!");
			    		port = 8450;
			    	}
		    			connect();
	    		}
	    		catch(NumberFormatException nfe) {
	    			showMessage("Ungültiger Port! Nehme Standartport 8450!");
	    			port = 8450;
	    			connect();
	    		}
	    	}
    	}
	}
}