import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ChatApplet extends JApplet implements ActionListener { /* GUI properties */ private JTextField nameField; private JButton connectButton; private JTextField messageField; private JTextArea messageArea; /* ChatApplet properties */ private MyChatSocket sock; public boolean isConnected = false; /* User values */ private String name; // of user private String hostname = "127.0.0.1"; private int hostport = 2015; public void init() { JPanel mainPanel = new JPanel(new BorderLayout()); /* The top most subpanel with user name and * connect button */ JPanel p = new JPanel(); p.setLayout(new BorderLayout()); p.add("West", (new JLabel("Name: "))); p.add("Center", (nameField = new JTextField("Your name please", 15))); p.add("East", (connectButton = new JButton("Connect"))); nameField.selectAll(); nameField.addActionListener(this); connectButton.setEnabled(false); connectButton.addActionListener(this); mainPanel.add("North", p); /* The middle subpanel with the message area */ p = new JPanel(new BorderLayout()); p.add("North", new JLabel("Messages:")); messageArea = new JTextArea(10, 30); messageArea.setEditable(false); messageArea.setBackground(Color.white); p.add("Center", new JScrollPane(messageArea)); p.add("South", new JLabel(" ")); // spacing (hack) mainPanel.add("Center", p); /* The lower panel with TextField for input */ p = new JPanel(new FlowLayout()); p.add("West", new JLabel("Message: ")); p.add("East", messageField = new JTextField(40)); messageField.addActionListener(this); mainPanel.add("South", p); getContentPane().add(mainPanel); } public void start() { nameField.requestFocus(); } public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if (source == messageField) { if (isConnected) { String txt = messageField.getText().trim(); if ( !txt.equals("wwhhoo")) { txt = name + " says: " + txt; } sendMessage(txt); messageField.setText(""); } else { messageField.setText("Please connect"); } } else if (source == connectButton) { if (isConnected) { disconnect(); } else { connect(); } } else if (source == nameField) { name = nameField.getText().trim(); if (name.equals("") || name.startsWith("Your n") || name.startsWith("Enter a")) { nameField.setText("Enter a name please"); nameField.selectAll(); } else { nameField.setEditable(false); nameField.setEnabled(false); preConnect(); } } } private void preConnect() { String input = JOptionPane.showInputDialog( this, // parent component "Specify host or OK for present host.\n" + "Actual host is " + hostname, "Specify host", // title JOptionPane.QUESTION_MESSAGE); if (input.length() > 0) { hostname = input; } do { input = JOptionPane.showInputDialog( this, // parent component "Specify port number or OK for present " + "port.\nActual port is " + hostport, "Specify port", // title JOptionPane.QUESTION_MESSAGE); if (input.length() > 0) { try { hostport = Integer.parseInt(input); } catch (NumberFormatException e) { hostport = -1; } } } while (hostport < 0); connectButton.setEnabled(true); connectButton.requestFocus(); } private void connect() { if (sock != null) { return; } try { while (sock == null) { sock = new MyChatSocket(this, hostname, hostport); } isConnected = true; connectButton.setText("Disconnect"); messageField.requestFocus(); messageField.setText(""); } catch (Exception e) { setMessage("Connection to " + hostname + " at port " + hostport + " failed."); setMessage("Please, try again."); connectButton.setEnabled(false); nameField.setEditable(true); nameField.setEnabled(true); nameField.requestFocus(); } } public void disconnect() { if (isConnected) sendMessage("logout"); isConnected = false; setMessage("Disconnected ==================="); if (sock != null) { try { sock.close(); } catch (IOException e) { setMessage("Error in disconnect:"); setMessage(e.getMessage()); } } sock = null; connectButton.setEnabled(false); connectButton.setText("Connect"); nameField.setEditable(true); nameField.setEnabled(true); nameField.requestFocus(); } static String EOL = System.getProperty("line.separator"); public void setMessage(String str) { messageArea.append(str + EOL); if (messageArea.getLineCount() > 500) { messageArea.replaceRange("", 0, 4000); /* delete 10000 characters, assuming more * than 10 characters a row, still leaving * a text buffer */ } messageArea.setCaretPosition( messageArea.getText().length()); } public void sendMessage(String txt) { if (sock == null) { connect(); } try { PrintWriter pws = new PrintWriter( sock.getOutputStream()); pws.println(txt); pws.flush(); } catch (IOException e) { setMessage("Error sending messages."); setMessage(e.getMessage()); } } }