import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JChat extends JApplet { private JPanel contentPane; private JLabel lblMessage; private JLabel lblUsers; private JTextField txtMessage; private JTextArea txtChat; private JScrollPane jScrollPane3; private JList lstUsers; private JScrollPane jScrollPane4; private JButton buttonSend; private JPanel jPanel1; private JLabel lblEnter; private JTextField txtNick; private JButton buttonEnter; private JPanel jPanel3; private DefaultListModel listModel; private JChatClient client; private boolean isClientConnected; public void init() { try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); initializeBehaviors(); } }); } catch (Exception e) { System.err.println("Errore nella creazione della interfaccia grafica"); } } public void destroy() { if (client == null) return; disconnect(); } private void createGUI() { try { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel") ; } catch (Exception ex) { System.out.println("Errore durante il caricamento del Look & Feel: "); System.out.println(ex); } createGUIControls(); setContentPane(); setJPanel1(); setJPanel3(); this.setLocation(new Point(0, 0)); this.setSize(new Dimension(520, 390)); } private void createGUIControls() { contentPane = (JPanel)this.getContentPane(); lblMessage = new JLabel(); lblUsers = new JLabel(); txtMessage = new JTextField(); txtChat = new JTextArea(); jScrollPane3 = new JScrollPane(); listModel = new DefaultListModel(); lstUsers = new JList(listModel); jScrollPane4 = new JScrollPane(); buttonSend = new JButton(); jPanel1 = new JPanel(); lblEnter = new JLabel(); txtNick = new JTextField(); buttonEnter = new JButton(); jPanel3 = new JPanel(); } private void setContentPane() { contentPane.setLayout(null); addComponent(contentPane, jPanel1, 0,0,520,340); addComponent(contentPane, jPanel3, 0,333,520,56); } private void setJPanel1() { lblMessage.setText("Il tuo messaggio:"); lblUsers.setText("Utenti connessi"); txtChat.setEditable(false); txtChat.setLineWrap(true); jScrollPane3.setViewportView(txtChat); jScrollPane4.setViewportView(lstUsers); buttonSend.setText("Invia"); buttonSend.setEnabled(false); jPanel1.setLayout(null); addComponent(jPanel1, lblMessage, 2,277,86,18); addComponent(jPanel1, lblUsers, 394,4,82,18); addComponent(jPanel1, txtMessage, 89,276,278,22); addComponent(jPanel1, jScrollPane3, 4,6,364,241); addComponent(jPanel1, jScrollPane4, 383,26,105,223); addComponent(jPanel1, buttonSend, 393,273,83,28); } private void setJPanel3() { lblEnter.setText("Scegli un nickname e premi il pulsante Entra in Chat!:"); buttonEnter.setText("Entra in Chat!"); jPanel3.setLayout(null); addComponent(jPanel3, lblEnter, 3,16,253,18); addComponent(jPanel3, txtNick, 258,13,122,22); addComponent(jPanel3, buttonEnter, 390,11,102,28); } private void initializeBehaviors() { buttonSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { buttonSend_actionPerformed(e); } }); buttonEnter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { buttonEnter_actionPerformed(e); } }); } private void addComponent(Container container, Component c, int x, int y, int width,int height) { c.setBounds(x,y,width,height); container.add(c); } private void buttonSend_actionPerformed(ActionEvent e) { // Se non e' stato inserito alcun messaggio, nulla da fare if (txtMessage.equals("")) return; try { // Il client invia il messaggio al Server e ripulisce il campo txtMessage client.sendMessage(txtNick.getText() + ": " + txtMessage.getText()); txtMessage.setText(""); } catch (Exception ex) { ex.printStackTrace() ; } } private void joinToChat() { // Verifica che sia stato inserito un Nick if (txtNick.getText().equals("")) return; // Crea un client di tipo JChatClient client = new JChatClient(); try { // Il client instaura una connessione con il Server (JChatServer) client.start(); // Il client richiede al Server di aggiungere alla lista dei Client // connessi, il nuovo utente (ovvero il suo IP) client.sendMessage("~" + txtNick.getText()); // Si legge il messaggio ricevuto dal server String strReceived = client.receiveMessage(); System.out.println(strReceived); // Se il server risponde dicendo che il Nick inserito è gia' presente // allora si mostra un messaggio di errore, si cancella il nick // scelto e si chiude la connessione con il server if(strReceived.startsWith("NOGOODUSER")) { // Inserire qui una eventuale JDialog che avvisi l"utente che // si è scelto un nick gia' in uso da qualcun altro //..... txtNick.setText(""); disconnect(); return; } // Se il Server risponde al Client OK allora è possibile caricare // la lista degli utenti, inserire il nickname in tale lista e // iniziare ad utilizzare la Chat if(strReceived.startsWith("OKNEWUSER")) { strReceived = strReceived.substring(9); // Ricava la lista utenti if(! strReceived.equals("") ) { String[] users = strReceived.split("~"); for (int i = 0; i < users.length ; i++) { listModel.insertElementAt(users[i],listModel.getSize()); } } else { listModel.insertElementAt(txtNick.getText(),listModel.getSize()); } txtMessage.setEnabled(true); buttonSend.setEnabled(true); buttonEnter.setText("Esci"); txtNick.setEnabled(false); // Parte il thread per restare in ascolto isClientConnected = true; startReceiveThread(); } } catch (Exception exc) { System.out.println("Eccezione durante la creazione del client"); exc.printStackTrace() ; } } private void disconnect() { try { client.sendMessage("^" + txtNick.getText()); txtNick.setText(""); txtNick.setEnabled(true); buttonEnter.setText("Entra in Chat!"); listModel.removeAllElements() ; txtChat.setText(""); txtMessage.setText(""); txtMessage.setEnabled(false); buttonSend.setEnabled(false); isClientConnected = false; client.close(); } catch (Exception ex) { ex.printStackTrace(); } } private void buttonEnter_actionPerformed(ActionEvent e) { if (buttonEnter.getText().equals("Entra in Chat!") ) joinToChat(); else disconnect(); } private void startReceiveThread() { ParallelClient toRun = new ParallelClient(); Thread rcvThread = new Thread(toRun); rcvThread.start(); } public class ParallelClient implements Runnable { public void run() { String strLastText; String strReceived; while(isClientConnected) { try { strReceived = client.receiveMessage(); // Se la stringa ricevuta è null, probabilmente // il client e' stato disconnesso. Alla successiva iterazione // verrà concluso il ciclo while. if (strReceived == null) continue; // E' possibile che nel frattempo sia giunto un nuovo utente // In tal caso il server inviera' una stringa che inizia con // NEWUSER. Altrimenti bastera' inserire il messaggio del server // nella TextArea e ripulire il campo txtMessage if(strReceived.startsWith("NEWUSER")) { // In tal caso bisognera' inserire un nuovo utente // nella lista degli utenti. listModel.insertElementAt(strReceived.substring(7), listModel.getSize()); strLastText=txtChat.getText().equals("")?"" : txtChat.getText() + "\n"; txtChat.setText(strLastText + strReceived.substring(7) + " è entrato in chat\n"); } else if (strReceived.startsWith("REMOVEUSER")) { // In tal caso bisognera' rimuovere l'utente disconnesso // dalla lista degli utenti. listModel.removeElement(strReceived.substring(10)); } else { strLastText = txtChat.getText().equals("") ? "" : txtChat.getText() + "\n"; txtChat.setText(strLastText + strReceived); } } catch (Exception exc) { exc.printStackTrace(); } } } } }