Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Client.java
- package chatRoom;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.GridLayout;
- import java.awt.Toolkit;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.StringTokenizer;
- import javax.swing.DefaultListModel;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JList;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JSplitPane;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- import javax.swing.border.TitledBorder;
- public class Client {
- private JFrame frame;
- private JList userList;
- private JTextArea textArea;
- private JTextField textField;
- private JTextField txt_port;
- private JTextField txt_hostIp;
- private JTextField txt_name;
- private JButton btn_start;
- private JButton btn_stop;
- private JButton btn_send;
- private JPanel northPanel;
- private JPanel southPanel;
- private JScrollPane rightScroll;
- private JScrollPane leftScroll;
- private JSplitPane centerSplit;
- private DefaultListModel listModel;
- private boolean isConnected = false;
- private Socket socket;
- private PrintWriter out;
- private BufferedReader in;
- private ReceiveMessage receiveMessage;
- //private Map<String, User> onLineUsers = new HashMap<String, User>();
- public Client() {
- init();
- btn_start.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int port;
- if (isConnected) {
- JOptionPane.showMessageDialog(frame, "isConnected",
- "", JOptionPane.ERROR_MESSAGE);
- return;
- }
- try {
- try {
- port = Integer.parseInt(txt_port.getText().trim());
- } catch (NumberFormatException e2) {
- throw new Exception("Port error");
- }
- String hostIp = txt_hostIp.getText().trim();
- String name = txt_name.getText().trim();
- if (name.equals("") || hostIp.equals("")) {
- throw new Exception("No Login");
- }
- // ====> connect to server
- boolean flag = connectServer(port, hostIp, name);
- if (flag == false) {
- throw new Exception("Connection error");
- }
- frame.setTitle(name);
- JOptionPane.showMessageDialog(frame, "Welcome " + name);
- } catch (Exception exc) {
- JOptionPane.showMessageDialog(frame, exc.getMessage(),
- "", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
- btn_stop.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (!isConnected) {
- JOptionPane.showMessageDialog(frame, "Is not connected!",
- "", JOptionPane.ERROR_MESSAGE);
- return;
- }
- try {
- // close connection to server
- boolean flag = closeConnection();
- if (flag == false) {
- throw new Exception("Close error");
- }
- JOptionPane.showMessageDialog(frame, "I am leaving.");
- } catch (Exception exc) {
- JOptionPane.showMessageDialog(frame, exc.getMessage(),
- "", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
- frame.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- if (isConnected) {
- // close connection to server
- closeConnection();
- }
- System.exit(0);
- }
- });
- textField.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- send();
- }
- });
- btn_send.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- send();
- }
- });
- } // end of Client
- public void init() {
- textArea = new JTextArea();
- textArea.setEditable(false);
- textArea.setForeground(Color.blue);
- textField = new JTextField();
- txt_port = new JTextField("6666");
- txt_hostIp = new JTextField("127.0.0.1");
- txt_name = new JTextField("");
- btn_start = new JButton("Start");
- btn_stop = new JButton("Stop");
- btn_send = new JButton("Send");
- listModel = new DefaultListModel();
- userList = new JList(listModel);
- northPanel = new JPanel();
- northPanel.setLayout(new GridLayout(1, 7));
- northPanel.add(new JLabel("Port"));
- northPanel.add(txt_port);
- northPanel.add(new JLabel("IP"));
- northPanel.add(txt_hostIp);
- northPanel.add(new JLabel("Login"));
- northPanel.add(txt_name);
- northPanel.add(btn_start);
- northPanel.add(btn_stop);
- northPanel.setBorder(new TitledBorder(""));
- rightScroll = new JScrollPane(textArea);
- rightScroll.setBorder(new TitledBorder(""));
- leftScroll = new JScrollPane(userList);
- leftScroll.setBorder(new TitledBorder(""));
- southPanel = new JPanel(new BorderLayout());
- southPanel.add(textField, "Center");
- southPanel.add(btn_send, "East");
- southPanel.setBorder(new TitledBorder(""));
- centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll,
- rightScroll);
- centerSplit.setDividerLocation(100);
- frame = new JFrame("");
- //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png")));
- frame.setLayout(new BorderLayout());
- frame.add(northPanel, "North");
- frame.add(centerSplit, "Center");
- frame.add(southPanel, "South");
- frame.setSize(600, 400);
- int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
- int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;
- frame.setLocation((screen_width - frame.getWidth()) / 2,
- (screen_height - frame.getHeight()) / 2);
- frame.setVisible(true);
- }
- //LOGIN
- public boolean connectServer(int port, String hostIp, String name) {
- try {
- socket = new Socket(hostIp, port);
- out = new PrintWriter(socket.getOutputStream());
- in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- //LOGIN
- // name@/x.x.x.x
- sendMessage(name + "@" + socket.getLocalAddress().toString());
- //receive message
- //receiveMessage = new ReceiveMessage(in, textArea);
- receiveMessage = new ReceiveMessage();
- receiveMessage.start();
- isConnected = true;
- return true;
- } catch (Exception e) {
- textArea.append("Server port: " + port + "Server IP: " + hostIp + "\r\n");
- isConnected = false;
- return false;
- }
- }
- @SuppressWarnings("deprecation")
- public synchronized boolean closeConnection() {
- try {
- sendMessage("CLOSE");
- receiveMessage.stop(); //NullPointerException
- if (in != null) { in.close(); }
- if (out != null) { out.close(); }
- if (socket != null) { socket.close(); }
- isConnected = false;
- return true;
- } catch (IOException e1) {
- e1.printStackTrace();
- isConnected = true;
- return false;
- }
- }
- public void send() {
- if (!isConnected) {
- JOptionPane.showMessageDialog(frame, "Is not connected!", "",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- String message = textField.getText().trim();
- if (message == null || message.equals("")) {
- JOptionPane.showMessageDialog(frame, "No message", "",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- // username@ALL@hello world
- sendMessage(frame.getTitle() + "@" + "ALL" + "@" + message);
- textField.setText(null);
- }
- public void sendMessage(String message) {
- out.println(message);
- out.flush();
- }
- class ReceiveMessage extends Thread {
- public void run() {
- String msgFromServer = "";
- while (true) {
- try {
- // => CLOSE, ADD@, DELETE@, USERLIST@, MAX@, or username: hi
- msgFromServer = in.readLine();
- System.out.println(msgFromServer);
- // '/' or, '@'
- StringTokenizer tok = new StringTokenizer(msgFromServer, "/@");
- String command = tok.nextToken();
- // CLOSE
- if (command.equals("CLOSE")) {
- textArea.append("Server closed!\r\n");
- removeUsers();
- return;
- // MAX@username/x.x.x.x
- } else if (command.equals("MAX")) {
- textArea.append("Max limited!\r\n");
- removeUsers();
- return;
- // DELETE@username
- } else if (command.equals("DELETE")) {
- String username = tok.nextToken();
- listModel.removeElement(username);
- // ADD@username/x.x.x.x
- } else if (command.equals("ADD")) {
- String username = "";
- String userIp = "";
- if ((username = tok.nextToken()) != null
- && (userIp = tok.nextToken()) != null) {
- listModel.addElement(username);
- }
- // USERLIST@numOfUser@username@/x.x.x.x@username@/x.x.x.x
- } else if (command.equals("USERLIST")) {
- int numOfUser = Integer.parseInt(tok.nextToken());
- String username = null;
- String userIp = null;
- for (int i = 0; i < numOfUser; i++) {
- username = tok.nextToken();
- userIp = tok.nextToken();
- listModel.addElement(username);
- }
- // username: hello world
- } else {
- textArea.append(msgFromServer + "\r\n");
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- public synchronized void removeUsers() throws Exception {
- listModel.removeAllElements();
- if (in != null) { in.close(); }
- if (out != null) { out.close(); }
- if (socket != null) { socket.close(); }
- isConnected = false;
- }
- }
- public static void main(String[] args) {
- new Client();
- }
- }
- // Server.java
- package chatRoom;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.GridLayout;
- import java.awt.Toolkit;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.BindException;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.StringTokenizer;
- import javax.swing.DefaultListModel;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JList;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JSplitPane;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- import javax.swing.border.TitledBorder;
- public class Server {
- private JFrame frame;
- JTextArea contentArea;
- private JTextField txt_message;
- private JTextField txt_max;
- private JTextField txt_port;
- private JButton btn_start;
- private JButton btn_stop;
- private JButton btn_send;
- private JPanel northPanel;
- private JPanel southPanel;
- private JScrollPane rightPanel;
- private JScrollPane leftPanel;
- private JSplitPane centerSplit;
- private JList userList;
- DefaultListModel listModel;
- private ServerSocket serverSocket;
- private ServerConnect serverConnect;
- ArrayList<NewClient> clientArray = new ArrayList<NewClient>();
- String loginName = "";
- String loginIP = "";
- private boolean isStart = false;
- public Server() {
- init();
- frame.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- if (isStart) {
- closeServer();
- }
- System.exit(0);
- }
- });
- txt_message.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- send();
- }
- });
- btn_send.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- send();
- }
- });
- btn_start.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (isStart) {
- JOptionPane.showMessageDialog(frame, "Already started",
- "", JOptionPane.ERROR_MESSAGE);
- return;
- }
- int max;
- int port;
- try {
- try {
- max = Integer.parseInt(txt_max.getText());
- } catch (Exception e1) {
- throw new Exception("max error");
- }
- if (max <= 0) {
- throw new Exception("max is null");
- }
- try {
- port = Integer.parseInt(txt_port.getText());
- } catch (Exception e1) {
- throw new Exception("port error");
- }
- if (port <= 0) {
- throw new Exception("port is null");
- }
- serverStart(max, port);
- contentArea.append("max is " + max + ", port is " + port
- + "\r\n");
- JOptionPane.showMessageDialog(frame, "Started!");
- btn_start.setEnabled(false);
- txt_max.setEnabled(false);
- txt_port.setEnabled(false);
- btn_stop.setEnabled(true);
- } catch (Exception exc) {
- JOptionPane.showMessageDialog(frame, exc.getMessage(),
- "", JOptionPane.ERROR_MESSAGE);
- }
- }
- });
- btn_stop.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (!isStart) {
- JOptionPane.showMessageDialog(frame, "Not started!", "",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- try {
- closeServer();
- btn_start.setEnabled(true);
- txt_max.setEnabled(true);
- txt_port.setEnabled(true);
- btn_stop.setEnabled(false);
- contentArea.append("Closed!\r\n");
- JOptionPane.showMessageDialog(frame, "Closed!");
- } catch (Exception exc) {
- JOptionPane.showMessageDialog(frame, "Closing error!", "",
- JOptionPane.ERROR_MESSAGE);
- }
- }
- });
- }
- public void init() {
- frame = new JFrame("");
- //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png")));
- //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Server.class.getResource("qq.png")));
- contentArea = new JTextArea();
- contentArea.setEditable(false);
- contentArea.setForeground(Color.blue);
- txt_message = new JTextField();
- txt_max = new JTextField("30");
- txt_port = new JTextField("6666");
- btn_start = new JButton("Start");
- btn_stop = new JButton("Stop");
- btn_send = new JButton("Send");
- btn_stop.setEnabled(false);
- listModel = new DefaultListModel();
- userList = new JList(listModel);
- southPanel = new JPanel(new BorderLayout());
- southPanel.setBorder(new TitledBorder(""));
- southPanel.add(txt_message, "Center");
- southPanel.add(btn_send, "East");
- leftPanel = new JScrollPane(userList);
- leftPanel.setBorder(new TitledBorder(""));
- rightPanel = new JScrollPane(contentArea);
- rightPanel.setBorder(new TitledBorder(""));
- centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,
- rightPanel);
- centerSplit.setDividerLocation(100);
- northPanel = new JPanel();
- northPanel.setLayout(new GridLayout(1, 6));
- northPanel.add(new JLabel("Max of chatter"));
- northPanel.add(txt_max);
- northPanel.add(new JLabel("Port"));
- northPanel.add(txt_port);
- northPanel.add(btn_start);
- northPanel.add(btn_stop);
- northPanel.setBorder(new TitledBorder(""));
- frame.setLayout(new BorderLayout());
- frame.add(northPanel, "North");
- frame.add(centerSplit, "Center");
- frame.add(southPanel, "South");
- frame.setSize(600, 400);
- //frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
- int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
- int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;
- frame.setLocation((screen_width - frame.getWidth()) / 2,
- (screen_height - frame.getHeight()) / 2);
- frame.setVisible(true);
- }
- public void serverStart(int max, int port) throws java.net.BindException {
- try {
- serverSocket = new ServerSocket(port);
- serverConnect = new ServerConnect(this, serverSocket, max);
- serverConnect.start();
- isStart = true;
- } catch (BindException e) {
- isStart = false;
- throw new BindException("Server is already connected");
- } catch (Exception e1) {
- e1.printStackTrace();
- isStart = false;
- throw new BindException("Bind Exception");
- }
- }
- @SuppressWarnings("deprecation")
- public void closeServer() {
- try {
- if (serverConnect != null) {
- serverConnect.stop(); //SocketException: Socket closed
- }
- for (int i = clientArray.size() - 1; i >= 0; i--) {
- clientArray.get(i).sendToMe("CLOSE");
- //guestArray.get(i).getWriter().flush();
- clientArray.get(i).stop(); // Exception
- clientArray.get(i).in.close();
- clientArray.get(i).out.close();
- clientArray.get(i).clientSocket.close();
- clientArray.remove(i);
- }
- if (serverSocket != null) {
- serverSocket.close();
- }
- listModel.removeAllElements();
- isStart = false;
- } catch (IOException e) {
- e.printStackTrace();
- isStart = true;
- }
- }
- public void send() {
- if (!isStart) {
- JOptionPane.showMessageDialog(frame, "Server is not working", "Warning",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- if (clientArray.size() == 0) {
- JOptionPane.showMessageDialog(frame, "No client", "Warning",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- String message = txt_message.getText().trim();
- if (message == null || message.equals("")) {
- JOptionPane.showMessageDialog(frame, "No message", "Warning",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- sendServerMessage(message);
- contentArea.append("Server: " + txt_message.getText() + "\r\n");
- txt_message.setText(null);
- }
- public void sendServerMessage(String message) {
- for (NewClient newClient : clientArray) {
- newClient.sendToMe("Server: " + message);
- }
- }
- class ServerConnect extends Thread {
- private ServerSocket serverSocket;
- private int max;
- private Server server;
- public ServerConnect(Server server, ServerSocket serverSocket, int max) {
- this.server = server;
- this.serverSocket = serverSocket;
- this.max = max;
- }
- public void run() {
- while (true) {
- try {
- Socket clientSocket = serverSocket.accept();
- if (clientArray.size() == max) {
- BufferedReader in = new BufferedReader(
- new InputStreamReader(clientSocket.getInputStream()));
- PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
- String infoUser = in.readLine();
- // userName/127.0.0.1
- StringTokenizer tok = new StringTokenizer(infoUser, "@");
- //user = new ServerUser(tok.nextToken(), tok.nextToken());
- loginName = tok.nextToken();
- loginIP = tok.nextToken();
- //send to limited user
- out.println("MAX@" + loginName + loginIP);
- out.flush();
- in.close();
- out.close();
- clientSocket.close();
- continue;
- }
- NewClient newClient = new NewClient(server, clientSocket);
- newClient.start(); // receiving message from client
- // clientArray will be added after receiving message from client
- clientArray.add(newClient);
- listModel.addElement(newClient.getUserName());
- contentArea.append("Joined: " + newClient.getUserName()
- + newClient.getUserIP() + "\r\n");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- } // end of ServerConnect class
- public static void main(String[] args) {
- new Server();
- }
- }
- // NewClient.java
- package chatRoom;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.util.StringTokenizer;
- public class NewClient extends Thread {
- Socket clientSocket;
- Server server;
- BufferedReader in;
- PrintWriter out;
- String loginName = "";
- String loginIP = "";
- // LOGIN
- public NewClient(Server server, Socket clientSocket) throws IOException {
- this.server = server;
- this.clientSocket = clientSocket;
- in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
- out = new PrintWriter(clientSocket.getOutputStream());
- String loginInfo = in.readLine();
- // userName@/127.0.0.1 => (userName, userIP)
- StringTokenizer tok = new StringTokenizer(loginInfo, "@");
- loginName = tok.nextToken();
- loginIP = tok.nextToken();
- sendToMe("Welcome " + loginName + loginIP);
- // ==> send the list of chatters to clients <==
- // clientArray is not added in the beginning
- // is added after run()
- // new user
- if (server.clientArray.size() > 0) {
- String temp = "";
- for (NewClient newClient : server.clientArray) {
- temp += (newClient.loginName + newClient.loginIP) + "@";
- }
- // send other's login info to me
- sendToMe("USERLIST@" + server.clientArray.size() + "@" + temp);
- }
- // old user
- for (NewClient newClient : server.clientArray) {
- // send my login info to other
- newClient.sendToMe("ADD@" + loginName + loginIP);
- }
- }
- // RECEIVING MESSAGE
- public void run() {
- String msgFromClient = null;
- while (true) {
- try {
- // msgFromClient = username@ALL@hello world
- msgFromClient = in.readLine();
- if (msgFromClient.equals("CLOSE")) {
- server.contentArea.append("Left: " + loginName + loginIP + "\r\n");
- in.close();
- out.close();
- clientSocket.close();
- for (NewClient newClient : server.clientArray) {
- newClient.sendToMe("DELETE@" + loginName);
- }
- server.listModel.removeElement(loginName);
- server.clientArray.remove(this);
- return; // error without "return"
- } else {
- // msgFromClient = username@ALL@hello world
- StringTokenizer tok = new StringTokenizer(msgFromClient, "@");
- String sender = tok.nextToken();
- String receiver = tok.nextToken();
- String content = tok.nextToken();
- for (NewClient newClient : server.clientArray) {
- if (receiver.equals("ALL")) {
- if (!sender.equals(newClient.getUserName())) {
- msgFromClient = sender + ": " + content;
- newClient.sendToMe(msgFromClient);
- } else {
- String msgFromMe = "Me" + ": " + content;
- sendToMe(msgFromMe);
- msgFromClient = sender + ": " + content;
- }
- }
- }
- server.contentArea.append(msgFromClient + "\r\n");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public void sendToMe(String msg) {
- out.println(msg);
- out.flush();
- }
- public String getUserName() {
- return loginName;
- }
- public String getUserIP() {
- return loginIP;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment