/** * Java. Level 2. Lesson 8 * Simple chat client * To make jar file: * > create manifest.txt file with 1 line * Main-Class: ChatClient * > jar -cvmf manifest.txt ChatClient.jar * ChatClient*.class IConstants.class * * @author Sergey Iryupin * @version 0.2.4 dated Jun 29, 2018 */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.*; class ChatClient extends JFrame implements ActionListener, IConstants { final String TITLE_OF_PROGRAM = "Client for net.chat"; final int WINDOW_WIDTH = 350; final int WINDOW_HEIGHT = 450; final String BTN_ENTER = "Enter"; final String AUTH_INVITATION = "You must login using command\n"+ "auth "; JTextArea dialogue; // area for dialog JTextField message; // field for entering messages boolean isAuthorized; // flag of authorization Socket socket; PrintWriter writer; BufferedReader reader; public static void main(String[] args) { new ChatClient(); } /** * Constructor: * Creating a window and all the necessary elements on it */ ChatClient() { setTitle(TITLE_OF_PROGRAM); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(WINDOW_WIDTH, WINDOW_HEIGHT); setLocationRelativeTo(null); // to the center addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); try { writer.println(EXIT_COMMAND); writer.flush(); } catch (Exception ex) {} } }); // area for dialog dialogue = new JTextArea(); dialogue.setLineWrap(true); dialogue.setEditable(false); JScrollPane scrollBar = new JScrollPane(dialogue); // panel for connamd field and button JPanel bp = new JPanel(); bp.setLayout(new BoxLayout(bp, BoxLayout.X_AXIS)); message = new JTextField(); message.addActionListener(this); JButton enter = new JButton(BTN_ENTER); enter.addActionListener(this); // adding all elements to the window bp.add(message); bp.add(enter); add(BorderLayout.CENTER, scrollBar); add(BorderLayout.SOUTH, bp); setVisible(true); Connect(); // connect to the Server } /** * Connect to the Server */ void Connect() { dialogue.append(AUTH_INVITATION + "\n"); isAuthorized = false; try { socket = new Socket(SERVER_ADDR, SERVER_PORT); writer = new PrintWriter(socket.getOutputStream()); reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); new Thread(new ServerListener()).start(); // start Server listener } catch (Exception ex) { dialogue.append(ex.getMessage() + "\n"); } } /** * ServerListener: get messages from Server */ class ServerListener implements Runnable { String message; public void run() { try { while ((message = reader.readLine()) != null) { if (message.startsWith("Hello, ")) // check authorisation isAuthorized = true; if (!message.equals("\0") && isAuthorized) dialogue.append(message + "\n"); if (message.equals(AUTH_FAIL)) System.exit(-1); // terminate client } } catch (Exception ex) { System.out.println(ex.getMessage()); } System.exit(-1); // terminate client } } /** * Listener of events from message field and enter button */ @Override public void actionPerformed(ActionEvent event) { if (message.getText().trim().length() > 0) { try { writer.println(message.getText()); writer.flush(); } catch (Exception ex) {} } message.setText(""); message.requestFocusInWindow(); } }