rendered paste bodypackage 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();
}
}
}
}
}