aquaballoon

Java - Chatting Room ( GUI server)

Jun 30th, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 28.37 KB | None | 0 0
  1. // Client.java
  2. package chatRoom;
  3.  
  4. import java.awt.BorderLayout;
  5. import java.awt.Color;
  6. import java.awt.GridLayout;
  7. import java.awt.Toolkit;
  8. import java.awt.event.ActionEvent;
  9. import java.awt.event.ActionListener;
  10. import java.awt.event.WindowAdapter;
  11. import java.awt.event.WindowEvent;
  12. import java.io.BufferedReader;
  13. import java.io.IOException;
  14. import java.io.InputStreamReader;
  15. import java.io.PrintWriter;
  16. import java.net.Socket;
  17. import java.util.HashMap;
  18. import java.util.Map;
  19. import java.util.StringTokenizer;
  20.  
  21. import javax.swing.DefaultListModel;
  22. import javax.swing.JButton;
  23. import javax.swing.JFrame;
  24. import javax.swing.JLabel;
  25. import javax.swing.JList;
  26. import javax.swing.JOptionPane;
  27. import javax.swing.JPanel;
  28. import javax.swing.JScrollPane;
  29. import javax.swing.JSplitPane;
  30. import javax.swing.JTextArea;
  31. import javax.swing.JTextField;
  32. import javax.swing.border.TitledBorder;
  33.  
  34. public class Client {
  35.  
  36.     private JFrame frame;
  37.     private JList userList;
  38.     private JTextArea textArea;
  39.     private JTextField textField;
  40.     private JTextField txt_port;
  41.     private JTextField txt_hostIp;
  42.     private JTextField txt_name;
  43.     private JButton btn_start;
  44.     private JButton btn_stop;
  45.     private JButton btn_send;
  46.     private JPanel northPanel;
  47.     private JPanel southPanel;
  48.     private JScrollPane rightScroll;
  49.     private JScrollPane leftScroll;
  50.     private JSplitPane centerSplit;
  51.  
  52.     private DefaultListModel listModel;
  53.  
  54.     private boolean isConnected = false;
  55.  
  56.     private Socket socket;
  57.     private PrintWriter out;
  58.     private BufferedReader in;
  59.     private ReceiveMessage receiveMessage;
  60.     //private Map<String, User> onLineUsers = new HashMap<String, User>();
  61.  
  62.     public Client() {
  63.  
  64.         init();
  65.  
  66.         btn_start.addActionListener(new ActionListener() {
  67.             public void actionPerformed(ActionEvent e) {
  68.                 int port;
  69.                 if (isConnected) {
  70.                     JOptionPane.showMessageDialog(frame, "isConnected",
  71.                             "", JOptionPane.ERROR_MESSAGE);
  72.                     return;
  73.                 }
  74.                 try {
  75.                     try {
  76.                         port = Integer.parseInt(txt_port.getText().trim());
  77.                     } catch (NumberFormatException e2) {
  78.                         throw new Exception("Port error");
  79.                     }
  80.  
  81.                     String hostIp = txt_hostIp.getText().trim();
  82.  
  83.                     String name = txt_name.getText().trim();
  84.  
  85.                     if (name.equals("") || hostIp.equals("")) {
  86.                         throw new Exception("No Login");
  87.                     }
  88.  
  89.                     // ====> connect to server
  90.                     boolean flag = connectServer(port, hostIp, name);
  91.  
  92.                     if (flag == false) {
  93.                         throw new Exception("Connection error");
  94.                     }
  95.  
  96.                     frame.setTitle(name);
  97.                     JOptionPane.showMessageDialog(frame, "Welcome " + name);
  98.  
  99.                 } catch (Exception exc) {
  100.                     JOptionPane.showMessageDialog(frame, exc.getMessage(),
  101.                             "", JOptionPane.ERROR_MESSAGE);
  102.                 }
  103.             }
  104.         });
  105.  
  106.         btn_stop.addActionListener(new ActionListener() {
  107.             public void actionPerformed(ActionEvent e) {
  108.                 if (!isConnected) {
  109.                     JOptionPane.showMessageDialog(frame, "Is not connected!",
  110.                             "", JOptionPane.ERROR_MESSAGE);
  111.                     return;
  112.                 }
  113.                 try {
  114.  
  115.                     // close connection to server
  116.                     boolean flag = closeConnection();
  117.  
  118.                     if (flag == false) {
  119.                         throw new Exception("Close error");
  120.                     }
  121.                    
  122.                     JOptionPane.showMessageDialog(frame, "I am leaving.");
  123.                    
  124.                 } catch (Exception exc) {
  125.                     JOptionPane.showMessageDialog(frame, exc.getMessage(),
  126.                             "", JOptionPane.ERROR_MESSAGE);
  127.                 }
  128.             }
  129.         });
  130.  
  131.         frame.addWindowListener(new WindowAdapter() {
  132.             public void windowClosing(WindowEvent e) {
  133.                 if (isConnected) {
  134.                    
  135.                     // close connection to server
  136.                     closeConnection();
  137.                 }
  138.                 System.exit(0);
  139.             }
  140.         });
  141.  
  142.         textField.addActionListener(new ActionListener() {
  143.             public void actionPerformed(ActionEvent arg0) {
  144.                 send();
  145.             }
  146.         });
  147.  
  148.         btn_send.addActionListener(new ActionListener() {
  149.             public void actionPerformed(ActionEvent e) {
  150.                 send();
  151.             }
  152.         });
  153.  
  154.     }  // end of Client
  155.  
  156.     public void init() {
  157.  
  158.         textArea = new JTextArea();
  159.         textArea.setEditable(false);
  160.         textArea.setForeground(Color.blue);
  161.         textField = new JTextField();
  162.         txt_port = new JTextField("6666");
  163.         txt_hostIp = new JTextField("127.0.0.1");
  164.         txt_name = new JTextField("");
  165.         btn_start = new JButton("Start");
  166.         btn_stop = new JButton("Stop");
  167.         btn_send = new JButton("Send");
  168.         listModel = new DefaultListModel();
  169.         userList = new JList(listModel);
  170.  
  171.         northPanel = new JPanel();
  172.         northPanel.setLayout(new GridLayout(1, 7));
  173.         northPanel.add(new JLabel("Port"));
  174.         northPanel.add(txt_port);
  175.         northPanel.add(new JLabel("IP"));
  176.         northPanel.add(txt_hostIp);
  177.         northPanel.add(new JLabel("Login"));
  178.         northPanel.add(txt_name);
  179.         northPanel.add(btn_start);
  180.         northPanel.add(btn_stop);
  181.         northPanel.setBorder(new TitledBorder(""));
  182.  
  183.         rightScroll = new JScrollPane(textArea);
  184.         rightScroll.setBorder(new TitledBorder(""));
  185.         leftScroll = new JScrollPane(userList);
  186.         leftScroll.setBorder(new TitledBorder(""));
  187.         southPanel = new JPanel(new BorderLayout());
  188.         southPanel.add(textField, "Center");
  189.         southPanel.add(btn_send, "East");
  190.         southPanel.setBorder(new TitledBorder(""));
  191.  
  192.         centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll,
  193.                 rightScroll);
  194.         centerSplit.setDividerLocation(100);
  195.  
  196.         frame = new JFrame("");
  197.         //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png")));  
  198.         frame.setLayout(new BorderLayout());
  199.         frame.add(northPanel, "North");
  200.         frame.add(centerSplit, "Center");
  201.         frame.add(southPanel, "South");
  202.         frame.setSize(600, 400);
  203.         int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
  204.         int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;
  205.         frame.setLocation((screen_width - frame.getWidth()) / 2,
  206.                 (screen_height - frame.getHeight()) / 2);
  207.         frame.setVisible(true);
  208.     }
  209.  
  210.     //LOGIN
  211.     public boolean connectServer(int port, String hostIp, String name) {
  212.  
  213.         try {
  214.             socket = new Socket(hostIp, port);
  215.             out = new PrintWriter(socket.getOutputStream());
  216.             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  217.  
  218.             //LOGIN
  219.             // name@/x.x.x.x
  220.             sendMessage(name + "@" + socket.getLocalAddress().toString());
  221.  
  222.             //receive message
  223.             //receiveMessage = new ReceiveMessage(in, textArea);
  224.             receiveMessage = new ReceiveMessage();
  225.             receiveMessage.start();
  226.  
  227.             isConnected = true;
  228.             return true;
  229.  
  230.         } catch (Exception e) {
  231.             textArea.append("Server port: " + port + "Server IP: " + hostIp + "\r\n");
  232.             isConnected = false;
  233.             return false;
  234.         }
  235.     }
  236.  
  237.     @SuppressWarnings("deprecation")
  238.     public synchronized boolean closeConnection() {
  239.         try {
  240.            
  241.             sendMessage("CLOSE");
  242.             receiveMessage.stop(); //NullPointerException
  243.  
  244.             if (in != null) { in.close(); }
  245.             if (out != null) { out.close(); }
  246.             if (socket != null) { socket.close(); }
  247.  
  248.             isConnected = false;
  249.             return true;
  250.  
  251.         } catch (IOException e1) {
  252.             e1.printStackTrace();
  253.             isConnected = true;
  254.             return false;
  255.         }
  256.     }
  257.  
  258.     public void send() {
  259.         if (!isConnected) {
  260.             JOptionPane.showMessageDialog(frame, "Is not connected!", "",
  261.                     JOptionPane.ERROR_MESSAGE);
  262.             return;
  263.         }
  264.  
  265.         String message = textField.getText().trim();
  266.  
  267.         if (message == null || message.equals("")) {
  268.             JOptionPane.showMessageDialog(frame, "No message", "",
  269.                     JOptionPane.ERROR_MESSAGE);
  270.             return;
  271.         }
  272.  
  273.         // username@ALL@hello world
  274.         sendMessage(frame.getTitle() + "@" + "ALL" + "@" + message);
  275.  
  276.         textField.setText(null);
  277.     }
  278.  
  279.     public void sendMessage(String message) {
  280.  
  281.         out.println(message);
  282.         out.flush();
  283.     }
  284.  
  285.     class ReceiveMessage extends Thread {
  286.  
  287.         public void run() {
  288.             String msgFromServer = "";
  289.             while (true) {
  290.                 try {
  291.                    
  292.                     // => CLOSE, ADD@, DELETE@, USERLIST@, MAX@, or username: hi
  293.                     msgFromServer = in.readLine();
  294.                     System.out.println(msgFromServer);
  295.  
  296.                     // '/' or, '@'
  297.                     StringTokenizer tok = new StringTokenizer(msgFromServer, "/@");
  298.  
  299.                     String command = tok.nextToken();
  300.  
  301.                     // CLOSE
  302.                     if (command.equals("CLOSE")) {
  303.                         textArea.append("Server closed!\r\n");
  304.                         removeUsers();
  305.                         return;
  306.                    
  307.                     // MAX@username/x.x.x.x    
  308.                     } else if (command.equals("MAX")) {
  309.                         textArea.append("Max limited!\r\n");
  310.                         removeUsers();
  311.                         return;
  312.                        
  313.                     // DELETE@username      
  314.                     } else if (command.equals("DELETE")) {
  315.  
  316.                         String username = tok.nextToken();
  317.  
  318.                         listModel.removeElement(username);
  319.                    
  320.                     // ADD@username/x.x.x.x  
  321.                     } else if (command.equals("ADD")) {
  322.                        
  323.                         String username = "";
  324.                         String userIp = "";
  325.                        
  326.                         if ((username = tok.nextToken()) != null
  327.                                 && (userIp = tok.nextToken()) != null) {
  328.                            
  329.                             listModel.addElement(username);
  330.                         }
  331.  
  332.                     // USERLIST@numOfUser@username@/x.x.x.x@username@/x.x.x.x        
  333.                     } else if (command.equals("USERLIST")) {
  334.  
  335.                         int numOfUser = Integer.parseInt(tok.nextToken());
  336.                         String username = null;
  337.                         String userIp = null;
  338.  
  339.                         for (int i = 0; i < numOfUser; i++) {
  340.                             username = tok.nextToken();
  341.                             userIp = tok.nextToken();
  342.                            
  343.                             listModel.addElement(username);
  344.                         }
  345.  
  346.                     // username: hello world
  347.                     } else {
  348.                         textArea.append(msgFromServer + "\r\n");
  349.                     }
  350.                 } catch (IOException e) {
  351.                     e.printStackTrace();
  352.                 } catch (Exception e) {
  353.                     e.printStackTrace();
  354.                 }
  355.             }
  356.         }
  357.  
  358.         public synchronized void removeUsers() throws Exception {
  359.  
  360.             listModel.removeAllElements();
  361.  
  362.             if (in != null) { in.close(); }
  363.             if (out != null) { out.close(); }
  364.             if (socket != null) { socket.close(); }
  365.             isConnected = false;
  366.         }
  367.     }  
  368.     public static void main(String[] args) {
  369.         new Client();
  370.     }
  371. }
  372.  
  373.  
  374. // Server.java
  375. package chatRoom;
  376.  
  377. import java.awt.BorderLayout;
  378. import java.awt.Color;
  379. import java.awt.GridLayout;
  380. import java.awt.Toolkit;
  381. import java.awt.event.ActionEvent;
  382. import java.awt.event.ActionListener;
  383. import java.awt.event.WindowAdapter;
  384. import java.awt.event.WindowEvent;
  385. import java.io.BufferedReader;
  386. import java.io.IOException;
  387. import java.io.InputStreamReader;
  388. import java.io.PrintWriter;
  389. import java.net.BindException;
  390. import java.net.ServerSocket;
  391. import java.net.Socket;
  392. import java.util.ArrayList;
  393. import java.util.StringTokenizer;
  394.  
  395. import javax.swing.DefaultListModel;
  396. import javax.swing.JButton;
  397. import javax.swing.JFrame;
  398. import javax.swing.JLabel;
  399. import javax.swing.JList;
  400. import javax.swing.JOptionPane;
  401. import javax.swing.JPanel;
  402. import javax.swing.JScrollPane;
  403. import javax.swing.JSplitPane;
  404. import javax.swing.JTextArea;
  405. import javax.swing.JTextField;
  406. import javax.swing.border.TitledBorder;
  407.  
  408. public class Server {
  409.  
  410.     private JFrame frame;
  411.     JTextArea contentArea;
  412.     private JTextField txt_message;
  413.     private JTextField txt_max;
  414.     private JTextField txt_port;
  415.     private JButton btn_start;
  416.     private JButton btn_stop;
  417.     private JButton btn_send;
  418.     private JPanel northPanel;
  419.     private JPanel southPanel;
  420.     private JScrollPane rightPanel;
  421.     private JScrollPane leftPanel;
  422.     private JSplitPane centerSplit;
  423.     private JList userList;
  424.     DefaultListModel listModel;
  425.  
  426.     private ServerSocket serverSocket;
  427.     private ServerConnect serverConnect;
  428.     ArrayList<NewClient> clientArray = new ArrayList<NewClient>();
  429.  
  430.     String loginName = "";
  431.     String loginIP = "";
  432.  
  433.     private boolean isStart = false;
  434.  
  435.     public Server() {
  436.  
  437.         init();
  438.  
  439.         frame.addWindowListener(new WindowAdapter() {
  440.             public void windowClosing(WindowEvent e) {
  441.                 if (isStart) {
  442.                     closeServer();
  443.                 }
  444.                 System.exit(0);
  445.             }
  446.         });
  447.  
  448.         txt_message.addActionListener(new ActionListener() {
  449.             public void actionPerformed(ActionEvent e) {
  450.                 send();
  451.             }
  452.         });
  453.  
  454.         btn_send.addActionListener(new ActionListener() {
  455.             public void actionPerformed(ActionEvent arg0) {
  456.                 send();
  457.             }
  458.         });
  459.  
  460.         btn_start.addActionListener(new ActionListener() {
  461.             public void actionPerformed(ActionEvent e) {
  462.                 if (isStart) {
  463.                     JOptionPane.showMessageDialog(frame, "Already started",
  464.                             "", JOptionPane.ERROR_MESSAGE);
  465.                     return;
  466.                 }
  467.                 int max;
  468.                 int port;
  469.                 try {
  470.                     try {
  471.                         max = Integer.parseInt(txt_max.getText());
  472.                     } catch (Exception e1) {
  473.                         throw new Exception("max error");
  474.                     }
  475.                     if (max <= 0) {
  476.                         throw new Exception("max is null");
  477.                     }
  478.                     try {
  479.                         port = Integer.parseInt(txt_port.getText());
  480.                     } catch (Exception e1) {
  481.                         throw new Exception("port error");
  482.                     }
  483.                     if (port <= 0) {
  484.                         throw new Exception("port is null");
  485.                     }
  486.  
  487.                     serverStart(max, port);
  488.  
  489.                     contentArea.append("max is " + max + ", port is " + port
  490.                             + "\r\n");
  491.  
  492.                     JOptionPane.showMessageDialog(frame, "Started!");
  493.  
  494.                     btn_start.setEnabled(false);
  495.                     txt_max.setEnabled(false);
  496.                     txt_port.setEnabled(false);
  497.                     btn_stop.setEnabled(true);
  498.  
  499.                 } catch (Exception exc) {
  500.                     JOptionPane.showMessageDialog(frame, exc.getMessage(),
  501.                             "", JOptionPane.ERROR_MESSAGE);
  502.                 }
  503.             }
  504.         });
  505.  
  506.         btn_stop.addActionListener(new ActionListener() {
  507.             public void actionPerformed(ActionEvent e) {
  508.                 if (!isStart) {
  509.                     JOptionPane.showMessageDialog(frame, "Not started!", "",
  510.                             JOptionPane.ERROR_MESSAGE);
  511.                     return;
  512.                 }
  513.                 try {
  514.  
  515.                     closeServer();
  516.  
  517.                     btn_start.setEnabled(true);
  518.                     txt_max.setEnabled(true);
  519.                     txt_port.setEnabled(true);
  520.                     btn_stop.setEnabled(false);
  521.                     contentArea.append("Closed!\r\n");
  522.                     JOptionPane.showMessageDialog(frame, "Closed!");
  523.                 } catch (Exception exc) {
  524.                     JOptionPane.showMessageDialog(frame, "Closing error!", "",
  525.                             JOptionPane.ERROR_MESSAGE);
  526.                 }
  527.             }
  528.         });
  529.     }
  530.  
  531.     public void init() {
  532.         frame = new JFrame("");
  533.         //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png")));  
  534.         //frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Server.class.getResource("qq.png")));  
  535.         contentArea = new JTextArea();
  536.         contentArea.setEditable(false);
  537.         contentArea.setForeground(Color.blue);
  538.         txt_message = new JTextField();
  539.         txt_max = new JTextField("30");
  540.         txt_port = new JTextField("6666");
  541.         btn_start = new JButton("Start");
  542.         btn_stop = new JButton("Stop");
  543.         btn_send = new JButton("Send");
  544.         btn_stop.setEnabled(false);
  545.         listModel = new DefaultListModel();
  546.         userList = new JList(listModel);
  547.  
  548.         southPanel = new JPanel(new BorderLayout());
  549.         southPanel.setBorder(new TitledBorder(""));
  550.         southPanel.add(txt_message, "Center");
  551.         southPanel.add(btn_send, "East");
  552.         leftPanel = new JScrollPane(userList);
  553.         leftPanel.setBorder(new TitledBorder(""));
  554.  
  555.         rightPanel = new JScrollPane(contentArea);
  556.         rightPanel.setBorder(new TitledBorder(""));
  557.  
  558.         centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,
  559.                 rightPanel);
  560.         centerSplit.setDividerLocation(100);
  561.         northPanel = new JPanel();
  562.         northPanel.setLayout(new GridLayout(1, 6));
  563.         northPanel.add(new JLabel("Max of chatter"));
  564.         northPanel.add(txt_max);
  565.         northPanel.add(new JLabel("Port"));
  566.         northPanel.add(txt_port);
  567.         northPanel.add(btn_start);
  568.         northPanel.add(btn_stop);
  569.         northPanel.setBorder(new TitledBorder(""));
  570.  
  571.         frame.setLayout(new BorderLayout());
  572.         frame.add(northPanel, "North");
  573.         frame.add(centerSplit, "Center");
  574.         frame.add(southPanel, "South");
  575.         frame.setSize(600, 400);
  576.         //frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
  577.         int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
  578.         int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;
  579.         frame.setLocation((screen_width - frame.getWidth()) / 2,
  580.                 (screen_height - frame.getHeight()) / 2);
  581.         frame.setVisible(true);
  582.     }
  583.  
  584.     public void serverStart(int max, int port) throws java.net.BindException {
  585.         try {
  586.  
  587.             serverSocket = new ServerSocket(port);
  588.  
  589.             serverConnect = new ServerConnect(this, serverSocket, max);
  590.             serverConnect.start();
  591.  
  592.             isStart = true;
  593.  
  594.         } catch (BindException e) {
  595.             isStart = false;
  596.             throw new BindException("Server is already connected");
  597.         } catch (Exception e1) {
  598.             e1.printStackTrace();
  599.             isStart = false;
  600.             throw new BindException("Bind Exception");
  601.         }
  602.     }
  603.  
  604.     @SuppressWarnings("deprecation")
  605.     public void closeServer() {
  606.         try {
  607.             if (serverConnect != null) {
  608.                 serverConnect.stop();  //SocketException: Socket closed
  609.             }
  610.             for (int i = clientArray.size() - 1; i >= 0; i--) {
  611.  
  612.                 clientArray.get(i).sendToMe("CLOSE");
  613.                 //guestArray.get(i).getWriter().flush();
  614.  
  615.                 clientArray.get(i).stop(); // Exception
  616.                 clientArray.get(i).in.close();
  617.                 clientArray.get(i).out.close();
  618.                 clientArray.get(i).clientSocket.close();
  619.                 clientArray.remove(i);
  620.             }
  621.             if (serverSocket != null) {
  622.                 serverSocket.close();
  623.             }
  624.             listModel.removeAllElements();
  625.             isStart = false;
  626.         } catch (IOException e) {
  627.             e.printStackTrace();
  628.             isStart = true;
  629.         }
  630.     }
  631.  
  632.     public void send() {
  633.         if (!isStart) {
  634.             JOptionPane.showMessageDialog(frame, "Server is not working", "Warning",
  635.                     JOptionPane.ERROR_MESSAGE);
  636.             return;
  637.         }
  638.         if (clientArray.size() == 0) {
  639.             JOptionPane.showMessageDialog(frame, "No client", "Warning",
  640.                     JOptionPane.ERROR_MESSAGE);
  641.             return;
  642.         }
  643.         String message = txt_message.getText().trim();
  644.         if (message == null || message.equals("")) {
  645.             JOptionPane.showMessageDialog(frame, "No message", "Warning",
  646.                     JOptionPane.ERROR_MESSAGE);
  647.             return;
  648.         }
  649.         sendServerMessage(message);
  650.  
  651.         contentArea.append("Server: " + txt_message.getText() + "\r\n");
  652.         txt_message.setText(null);
  653.     }
  654.  
  655.     public void sendServerMessage(String message) {
  656.         for (NewClient newClient : clientArray) {
  657.             newClient.sendToMe("Server: " + message);
  658.         }
  659.     }
  660.  
  661.     class ServerConnect extends Thread {
  662.  
  663.         private ServerSocket serverSocket;
  664.         private int max;
  665.         private Server server;
  666.  
  667.         public ServerConnect(Server server, ServerSocket serverSocket, int max) {
  668.             this.server = server;
  669.             this.serverSocket = serverSocket;
  670.             this.max = max;
  671.         }
  672.  
  673.         public void run() {
  674.             while (true) {
  675.                 try {
  676.                     Socket clientSocket = serverSocket.accept();
  677.  
  678.                     if (clientArray.size() == max) {
  679.  
  680.                         BufferedReader in = new BufferedReader(
  681.                                 new InputStreamReader(clientSocket.getInputStream()));
  682.                         PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
  683.  
  684.                         String infoUser = in.readLine();
  685.                         // userName/127.0.0.1
  686.                         StringTokenizer tok = new StringTokenizer(infoUser, "@");
  687.                         //user = new ServerUser(tok.nextToken(), tok.nextToken());
  688.  
  689.                         loginName = tok.nextToken();
  690.                         loginIP = tok.nextToken();
  691.  
  692.                         //send to limited user
  693.                         out.println("MAX@" + loginName + loginIP);
  694.                         out.flush();
  695.  
  696.                         in.close();
  697.                         out.close();
  698.                         clientSocket.close();
  699.                         continue;
  700.                     }
  701.  
  702.                     NewClient newClient = new NewClient(server, clientSocket);
  703.  
  704.                     newClient.start(); // receiving message from client
  705.  
  706.                     // clientArray will be added after receiving message from client
  707.                     clientArray.add(newClient);
  708.  
  709.                     listModel.addElement(newClient.getUserName());
  710.  
  711.                     contentArea.append("Joined: " + newClient.getUserName()
  712.                             + newClient.getUserIP() + "\r\n");
  713.  
  714.                 } catch (IOException e) {
  715.                     e.printStackTrace();
  716.                 }
  717.             }
  718.         }
  719.     }  // end of ServerConnect class
  720.  
  721.     public static void main(String[] args) {
  722.         new Server();
  723.     }
  724. }
  725.  
  726.  
  727. // NewClient.java
  728. package chatRoom;
  729.  
  730. import java.io.BufferedReader;
  731. import java.io.IOException;
  732. import java.io.InputStreamReader;
  733. import java.io.PrintWriter;
  734. import java.net.Socket;
  735. import java.util.StringTokenizer;
  736.  
  737. public class NewClient extends Thread {
  738.  
  739.     Socket clientSocket;
  740.     Server server;
  741.  
  742.     BufferedReader in;
  743.     PrintWriter out;
  744.  
  745.     String loginName = "";
  746.     String loginIP = "";
  747.  
  748.     // LOGIN
  749.     public NewClient(Server server, Socket clientSocket) throws IOException {
  750.  
  751.         this.server = server;
  752.         this.clientSocket = clientSocket;
  753.  
  754.         in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  755.         out = new PrintWriter(clientSocket.getOutputStream());
  756.  
  757.         String loginInfo = in.readLine();
  758.         // userName@/127.0.0.1 => (userName, userIP)
  759.         StringTokenizer tok = new StringTokenizer(loginInfo, "@");
  760.  
  761.         loginName = tok.nextToken();
  762.         loginIP = tok.nextToken();
  763.  
  764.         sendToMe("Welcome " + loginName + loginIP);
  765.  
  766.         // ==> send the list of chatters to clients <==
  767.         // clientArray is not added in the beginning
  768.         // is added after run()
  769.         // new user
  770.         if (server.clientArray.size() > 0) {
  771.             String temp = "";
  772.             for (NewClient newClient : server.clientArray) {
  773.                 temp += (newClient.loginName + newClient.loginIP) + "@";
  774.             }
  775.             // send other's login info to me
  776.             sendToMe("USERLIST@" + server.clientArray.size() + "@" + temp);
  777.         }
  778.  
  779.         // old user
  780.         for (NewClient newClient : server.clientArray) {
  781.             // send my login info to other
  782.             newClient.sendToMe("ADD@" + loginName + loginIP);
  783.         }
  784.     }
  785.  
  786.     // RECEIVING MESSAGE
  787.     public void run() {
  788.         String msgFromClient = null;
  789.         while (true) {
  790.             try {
  791.                 // msgFromClient = username@ALL@hello world
  792.                 msgFromClient = in.readLine();
  793.  
  794.                 if (msgFromClient.equals("CLOSE")) {
  795.                    
  796.                     server.contentArea.append("Left: " + loginName + loginIP + "\r\n");
  797.  
  798.                     in.close();
  799.                     out.close();
  800.                     clientSocket.close();
  801.  
  802.                     for (NewClient newClient : server.clientArray) {
  803.                         newClient.sendToMe("DELETE@" + loginName);
  804.                     }
  805.  
  806.                     server.listModel.removeElement(loginName);
  807.  
  808.                     server.clientArray.remove(this);
  809.                    
  810.                     return;  // error without "return"
  811.  
  812.                 } else {
  813.  
  814.                     // msgFromClient = username@ALL@hello world
  815.                     StringTokenizer tok = new StringTokenizer(msgFromClient, "@");
  816.  
  817.                     String sender = tok.nextToken();
  818.                     String receiver = tok.nextToken();
  819.                     String content = tok.nextToken();
  820.                    
  821.                     for (NewClient newClient : server.clientArray) {
  822.                         if (receiver.equals("ALL")) {
  823.                             if (!sender.equals(newClient.getUserName())) {
  824.                                 msgFromClient = sender + ": " + content;
  825.                                 newClient.sendToMe(msgFromClient);
  826.                             } else {
  827.                                 String msgFromMe = "Me" + ": " + content;
  828.                                 sendToMe(msgFromMe);
  829.                                 msgFromClient = sender + ": " + content;
  830.                             }
  831.                         }
  832.                     }
  833.                     server.contentArea.append(msgFromClient + "\r\n");
  834.                 }
  835.             } catch (IOException e) {
  836.                 e.printStackTrace();
  837.             }
  838.         }
  839.     }
  840.  
  841.     public void sendToMe(String msg) {
  842.         out.println(msg);
  843.         out.flush();
  844.     }
  845.  
  846.     public String getUserName() {
  847.         return loginName;
  848.     }
  849.  
  850.     public String getUserIP() {
  851.         return loginIP;
  852.     }
  853. }
Advertisement
Add Comment
Please, Sign In to add comment