Simple Chat Demo With Error Check - (client to client)

Server.java
~~~~~~~~~~
//Simple Chat Demo With Error Check - (client to client)(Java)

// Server.java

package com.chat.test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * Simple Chat Demo with error check server side
 *
 *
 */
public class Server {
    private boolean running;
    private ServerSocket ss;
    private Socket s;

    /*
     * use ArrayList to store all connect client
     */
    private List<Client> clients = new ArrayList<Client>();

    /*
     * construct method create server and wait client connect
     */
    public Server(int port) throws IOException {
        ss = new ServerSocket(port);
        System.out.println("server start!");
        running = true;

        /*
         * wait client connect
         */
        while (running) {
            s = ss.accept();

            /*
             * when client connect, add it to clients list and create new thread
             * to access it
             */
            Client c = new Client(s);
            clients.add(c);
            System.out.println("connect new client!");
            System.out.println("client numbers: " + clients.size());
            new Thread(c).start();
        }
    }

    /*
     * client access thread
     */
    private class Client implements Runnable {
        private Socket socket;
        private DataInputStream dis;
        private DataOutputStream dos;
        private boolean isConnected;

        /*
         * construct method, get input stream and output stream
         */
        public Client(Socket socket) throws IOException {

            this.socket = socket;
            InputStream is = socket.getInputStream();
            dis = new DataInputStream(is);

            OutputStream os = socket.getOutputStream();
            dos = new DataOutputStream(os);
            isConnected = true;
        }

        /*
         * use output stream send text to client
         */
        public void send(String text) {
            try {
                dos.writeUTF(text);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        /*
         * run method
         *
         * @see java.lang.Runnable#run()
         */
        public void run() {

            /*
             * get remote address and port
             */
            InetSocketAddress address = (InetSocketAddress) socket
                    .getRemoteSocketAddress();
            String host = address.getHostName();
            int port = address.getPort();

            /*
             * if connected, wait client send message to server.
             */
            while (isConnected) {
                try {
                    String text = dis.readUTF();
                    System.out.println("Get " + host + ":" + port
                            + " Message: " + text);

                    /*
                     * Iterator clients list, send get text to all client use
                     * test remote address method, to control text not send to
                     * sender
                     */
                    for (Client c : clients) {
                        if (!c.socket.getRemoteSocketAddress().equals(address))
                            c.send(text);
                    }

                } catch (IOException e) {
                    /*
                     * if readInput stream error occurs, then client
                     * disconnected. close all client connect resource.
                     */
                    if (dis != null)
                        try {
                            dis.close();
                            dos.close();
                            socket.close();
                            isConnected = false;
                            clients.remove(this);
                            System.out.println("disconnect client!");
                            System.out.println("Client numbers: "
                                    + clients.size());
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                }
            }

        }
    }

    /*
     * server main method create new server at 4444 port
     */
    public static void main(String[] args) {
        try {
            new Server(4444);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}





Client.java
~~~~~~~~~~~~
 package com.chat.test;

import java.awt.BorderLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * Simple Chat Demo with error check client side
 *
 *
 */
public class Client extends JFrame implements ActionListener {

    private JTextArea textArea;
    private TextField textField;
    private newClient client;
    private JButton button;

    public Client() {
        init();
    }

    /*
     * create client windows
     */
    private void init() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(200, 200, 400, 300);
        setTitle("Client");

        /*
         * add textArea to show message
         */
        textArea = new JTextArea();
        textArea.setEditable(false);
        textArea.setLineWrap(true);
        add(new JScrollPane(textArea));

        /*
         * add send textField and sendButton to send message
         */
        JPanel panel = new JPanel(new BorderLayout());
        add(panel, BorderLayout.SOUTH);

        textField = new TextField();
        textField.addActionListener(this);
        panel.add(textField);

        button = new JButton();
        button.addActionListener(this);
        panel.add(button, BorderLayout.EAST);

        /*
         * connect to server
         */
        connect();
    }

    /*
     * action access method, send text to server
     */
    public void actionPerformed(ActionEvent e) {
        String text = textField.getText();
        textArea.append("Send: ");
        textArea.append(text);
        textArea.append("\n");

        textField.setText("");
        textField.requestFocus();

        /*
         * client send message to server
         */
        client.send(text);

    }

    /*
     * connect to server
     */
    public void connect() {
        try {
            Socket socket = new Socket("127.0.0.1", 4444);
            System.out.println("client start");

            /*
             * create new thread to access connection
             */
            client = new newClient(socket);
            new Thread(client).start();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /*
     * add text to textArea
     */
    public void append(String text) {
        textArea.append(text);
        textArea.append("\n");
    }

    /*
     * connect access method
     */
    class newClient implements Runnable {

        private Socket socket;
        private DataInputStream dis;
        private DataOutputStream dos;
        private boolean isConnect;

        /*
         * construct method, get input stream and output stream
         */
        public newClient(Socket socket) {
            this.socket = socket;
            isConnect = true;
            try {
                InputStream is = socket.getInputStream();
                dis = new DataInputStream(is);

                OutputStream os = socket.getOutputStream();
                dos = new DataOutputStream(os);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        /*
         * send textField's text to server
         */
        public void send(String text) {
            try {
                dos.writeUTF(text);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        /*
         * thread access method
         */
        public void run() {

            /*
             * get remote address
             */
            InetSocketAddress address = (InetSocketAddress) socket
                    .getRemoteSocketAddress();
            String host = address.getHostName();
            int port = address.getPort();

            /*
             * wait server send text, if get text from server, add text to
             * textArea
             */
            while (isConnect) {
                try {
                    String text = dis.readUTF();
                    append("Get From " + host + ":" + port + " Message: "
                            + text);

                } catch (IOException e) {

                    /*
                     * if readInput stream error occurs, then server is
                     * disconnect, release all connect resources
                     */
                    System.out.println("server closed");
                    try {
                        dis.close();
                        dos.close();
                        isConnect = false;
                        socket.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }// end while
        }
    }

    /*
     * main method create new server
     */
    public static void main(String[] args) {
        new Client().setVisible(true);
    }
}


No comments:

Post a Comment