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 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(); 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("Herzlich Willkommen im Chat Client!"),mainBorderLayout.NORTH); //WEST c.add(pWest,mainBorderLayout.WEST); pWest.setLayout(borderLayoutpWest); lblTeilnehmerListe = new JLabel("Teilnehmerliste"); 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 list) { teilnehmerListe = (Vector) 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(); } } } } }