2017年7月29日 星期六

(Java) 聊天室






  1. Server(伺服器端) :  
  2.   
  3. /* 
  4.  * To change this license header, choose License Headers in Project Properties. 
  5.  * To change this template file, choose Tools | Templates 
  6.  * and open the template in the editor. 
  7.  */  
  8. package chats_.multi;  
  9.   
  10. import java.io.BufferedReader;  
  11. import java.io.IOException;  
  12. import java.io.InputStreamReader;  
  13. import java.io.PrintWriter;  
  14. import java.net.ServerSocket;  
  15. import java.net.Socket;  
  16. import java.net.SocketException;  
  17. import java.util.ArrayList;  
  18. import java.util.LinkedList;  
  19. import  java.util.*;  
  20. import java.util.logging.Level;  
  21. import java.util.logging.Logger;  
  22. import javax.swing.DefaultListModel;  
  23. import javax.swing.JOptionPane;  
  24.   
  25. /** 
  26.  * 
  27.  * @author 1 
  28.  */  
  29. public class Server extends javax.swing.JFrame {  
  30.   LinkedList clientOutputStreams;  
  31.   LinkedList<String> users;  
  32.     public Server() {  
  33.         initComponents();  
  34.     }  
  35. public class ClinetHandler implements Runnable{  
  36.   Socket socket ;  
  37.   PrintWriter out ;  
  38.   BufferedReader in ;   
  39.     public  ClinetHandler(Socket s , PrintWriter o){  
  40.       try {  
  41.           socket = s ;  
  42.           out = o ;  
  43.           in = new BufferedReader(new InputStreamReader(s.getInputStream()));            
  44.       } catch (IOException ex) {  
  45.           System.out.println("ERROR");  
  46.       }  
  47.      }  
  48.         @Override  
  49.         public void run() {  
  50.             String mess ;  
  51.             String conn = "連接";  
  52.             String exit = "離開";  
  53.             String chat = "聊天";  
  54.             String[] data;  
  55.             String username = "";  
  56.             try{  
  57.                 while((mess = in.readLine()) != null){  
  58.                      jTextArea1.append(" 收到 : "+ mess + " \n");  
  59.                      data = mess.split(":");  
  60.                      username = data[0];  
  61.                      if(data[2].equals(conn)){  
  62.                          telleveryone(data[0]+":"+data[1]+":"+chat);  
  63.                          telleveryone("::重置");  
  64.                          addUeser(data[0]);  
  65.                      }else if(data[2].equals(exit)){  
  66.                          telleveryone(data[0]+":"+data[1]+":"+chat);  
  67.                          telleveryone("::重置");  
  68.                          removeUeser(data[0]);  
  69.                      }else if(data[2].equals(chat)){  
  70.                          telleveryone(mess);  
  71.                      }else{  
  72.                          jTextArea1.append(" 沒有滿足條件 \n");  
  73.                      }  
  74.                 }  
  75.               
  76.             }catch(Exception e){/*/**/  
  77.                 try {  
  78.                     socket.close();  
  79.                     jTextArea1.append(" 失去一個使用者連線 \n");  
  80.                    // e.printStackTrace();  
  81.                     clientOutputStreams.remove(out);  
  82.                     telleveryone("::重置");  
  83.                     removeUeser(username);  
  84.                 } catch (IOException ex) {  
  85.                     ex.printStackTrace();  
  86.                     JOptionPane.showMessageDialog(null"關閉錯誤....");  
  87.                     System.exit(-1);  
  88.                 }  
  89.             }  
  90.         }  
  91.   
  92.          
  93.       
  94.   }  
  95.           
  96.         private void show_Online_users(){  
  97.             DefaultListModel n = new  DefaultListModel();  
  98.             for(String user : users)  
  99.                 n.addElement(user);  
  100.              Users1.setModel(n);  
  101.         }  
  102.         private void telleveryone(String mess) {  
  103.          Iterator  users = clientOutputStreams.iterator() ; //收納至users  
  104.          while(users.hasNext()){  
  105.              PrintWriter writer = (PrintWriter) users.next() ;  
  106.             // jTextArea1.append(mess + "\n");  
  107.              writer.println(mess);  
  108.              writer.flush();     
  109.          }  
  110.         }  
  111.   
  112.         private void addUeser(String username) {  
  113.             users.add(username);  
  114.             jTextArea1.append(" 使用者 : "+ username + " 加入聊天室\n");  
  115.             show_Online_users();  
  116.             for(String u : users)  
  117.             telleveryone(u+": :連接");  
  118.         }  
  119.   
  120.         private void removeUeser(String username) {  
  121.             users.remove(username);  
  122.             show_Online_users();  
  123.             jTextArea1.append(" 使用者 : "+ username + " 已經退出聊天室\n");  
  124.             for(String u : users)  
  125.             telleveryone(u+": :連接");  
  126.         }  
  127.    public class ServerStart implements Runnable {//執行諸 負責二次按鈕  
  128.             
  129.           @Override  
  130.           public void run() {  
  131.               clientOutputStreams = new LinkedList();  
  132.               users = new  LinkedList();    
  133.               try{  
  134.                  ServerSocket ss = new ServerSocket(7788);   
  135.                  while(true){  
  136.                    Socket s =  ss.accept() ; //等待使勇者連上來  
  137.                    PrintWriter p  = new PrintWriter(s.getOutputStream(),true); //Autoflush true  
  138.                    clientOutputStreams.add(p) ;  
  139.                    new Thread(new ClinetHandler(s , p )).start();  
  140.                    jTextArea1.append(" 連接到一個使用者\n");  
  141.                  }  
  142.               }catch(Exception e){  
  143.                   e.printStackTrace();  
  144.                   JOptionPane.showMessageDialog(null"連結錯誤""訊息" , JOptionPane.ERROR_MESSAGE);  
  145.               }  
  146.           }  
  147.       
  148.        }  
  149.     @SuppressWarnings("unchecked")  
  150.     // <editor-fold defaultstate="collapsed" desc="Generated Code">                            
  151.     private void initComponents() {  
  152.   
  153.         jSeparator1 = new javax.swing.JSeparator();  
  154.         jScrollPane1 = new javax.swing.JScrollPane();  
  155.         jTextArea1 = new javax.swing.JTextArea();  
  156.         jPanel1 = new javax.swing.JPanel();  
  157.         ONLINE_USERS = new javax.swing.JButton();  
  158.         CLEAR = new javax.swing.JButton();  
  159.         BUILLD = new javax.swing.JButton();  
  160.         ENDBUT = new javax.swing.JButton();  
  161.         jScrollPane2 = new javax.swing.JScrollPane();  
  162.         Users1 = new javax.swing.JList<>();  
  163.         jLabel1 = new javax.swing.JLabel();  
  164.   
  165.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
  166.         setTitle("伺服器控制台");  
  167.         setMaximumSize(new java.awt.Dimension(465575));  
  168.         setMinimumSize(new java.awt.Dimension(465575));  
  169.         setPreferredSize(new java.awt.Dimension(465575));  
  170.         setResizable(false);  
  171.         getContentPane().setLayout(null);  
  172.   
  173.         jTextArea1.setBackground(new java.awt.Color(153153153));  
  174.         jTextArea1.setColumns(20);  
  175.         jTextArea1.setFont(new java.awt.Font("MS PGothic"114)); // NOI18N  
  176.         jTextArea1.setRows(5);  
  177.         jTextArea1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(000), 4));  
  178.         jScrollPane1.setViewportView(jTextArea1);  
  179.   
  180.         getContentPane().add(jScrollPane1);  
  181.         jScrollPane1.setBounds(1010343405);  
  182.   
  183.         jPanel1.setBackground(new java.awt.Color(102102102));  
  184.         jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153153153)));  
  185.         jPanel1.setLayout(new java.awt.GridLayout(22));  
  186.   
  187.         ONLINE_USERS.setBackground(new java.awt.Color(255255255));  
  188.         ONLINE_USERS.setFont(new java.awt.Font("微軟正黑體"114)); // NOI18N  
  189.         ONLINE_USERS.setText("使用者剔除");  
  190.         ONLINE_USERS.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));  
  191.         ONLINE_USERS.addActionListener(new java.awt.event.ActionListener() {  
  192.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  193.                 ONLINE_USERSActionPerformed(evt);  
  194.             }  
  195.         });  
  196.         jPanel1.add(ONLINE_USERS);  
  197.   
  198.         CLEAR.setBackground(new java.awt.Color(255255255));  
  199.         CLEAR.setFont(new java.awt.Font("微軟正黑體"114)); // NOI18N  
  200.         CLEAR.setText("刪除訊息");  
  201.         CLEAR.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));  
  202.         CLEAR.addActionListener(new java.awt.event.ActionListener() {  
  203.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  204.                 CLEARActionPerformed(evt);  
  205.             }  
  206.         });  
  207.         jPanel1.add(CLEAR);  
  208.   
  209.         BUILLD.setBackground(new java.awt.Color(255255255));  
  210.         BUILLD.setFont(new java.awt.Font("微軟正黑體"114)); // NOI18N  
  211.         BUILLD.setText("建立");  
  212.         BUILLD.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));  
  213.         BUILLD.addActionListener(new java.awt.event.ActionListener() {  
  214.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  215.                 BUILLDActionPerformed(evt);  
  216.             }  
  217.         });  
  218.         jPanel1.add(BUILLD);  
  219.   
  220.         ENDBUT.setBackground(new java.awt.Color(255255255));  
  221.         ENDBUT.setFont(new java.awt.Font("微軟正黑體"114)); // NOI18N  
  222.         ENDBUT.setText("中止");  
  223.         ENDBUT.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));  
  224.         ENDBUT.addActionListener(new java.awt.event.ActionListener() {  
  225.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  226.                 ENDBUTActionPerformed(evt);  
  227.             }  
  228.         });  
  229.         jPanel1.add(ENDBUT);  
  230.   
  231.         getContentPane().add(jPanel1);  
  232.         jPanel1.setBounds(10430340100);  
  233.   
  234.         Users1.setBackground(new java.awt.Color(153153153));  
  235.         Users1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(000), 3));  
  236.         Users1.setFont(new java.awt.Font("微軟正黑體"118)); // NOI18N  
  237.         jScrollPane2.setViewportView(Users1);  
  238.   
  239.         getContentPane().add(jScrollPane2);  
  240.         jScrollPane2.setBounds(3601090410);  
  241.   
  242.         jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/chats_/multi/phone-icon.png"))); // NOI18N  
  243.         jLabel1.setText("jLabel1");  
  244.         getContentPane().add(jLabel1);  
  245.         jLabel1.setBounds(3704408090);  
  246.   
  247.         pack();  
  248.     }// </editor-fold>                          
  249.   
  250.     private void BUILLDActionPerformed(java.awt.event.ActionEvent evt) {                                         
  251.      Thread start = new Thread(new ServerStart());  
  252.      start.start();  
  253.      jTextArea1.append(" 建立成功.....");  
  254.     }                                        
  255.   
  256.     private void CLEARActionPerformed(java.awt.event.ActionEvent evt) {                                        
  257.         jTextArea1.setText("");  
  258.     }                                       
  259.   
  260.     private void ENDBUTActionPerformed(java.awt.event.ActionEvent evt) {                                         
  261.       try {  
  262.           Thread.sleep(10000);//使執行諸休息10SEC  
  263.       } catch (InterruptedException ex) {  
  264.          Thread.currentThread().interrupt();  
  265.       }  
  266.       jTextArea1.append("伺服器中斷回應......");  
  267.       telleveryone("伺服器已中斷回應......");  
  268.       jTextArea1.setText(" ");  
  269.     }                                        
  270.   
  271.     private void ONLINE_USERSActionPerformed(java.awt.event.ActionEvent evt) {                                               
  272.          System.out.print(Users1.getSelectedValue());  
  273.         telleveryone(Users1.getSelectedValue()+"::離開");  
  274.     }                                              
  275.   
  276.       
  277.     public static void main(String args[]) {  
  278.         /* Set the Nimbus look and feel */  
  279.         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">  
  280.         /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
  281.          * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html  
  282.          */  
  283.         try {  
  284.             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {  
  285.                 if ("Nimbus".equals(info.getName())) {  
  286.                     javax.swing.UIManager.setLookAndFeel(info.getClassName());  
  287.                     break;  
  288.                 }  
  289.             }  
  290.         } catch (ClassNotFoundException ex) {  
  291.             java.util.logging.Logger.getLogger(Server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  292.         } catch (InstantiationException ex) {  
  293.             java.util.logging.Logger.getLogger(Server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  294.         } catch (IllegalAccessException ex) {  
  295.             java.util.logging.Logger.getLogger(Server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  296.         } catch (javax.swing.UnsupportedLookAndFeelException ex) {  
  297.             java.util.logging.Logger.getLogger(Server.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  298.         }  
  299.         //</editor-fold>  
  300.   
  301.         /* Create and display the form */  
  302.         java.awt.EventQueue.invokeLater(new Runnable() {  
  303.             public void run() {  
  304.                 new Server().setVisible(true);  
  305.             }  
  306.         });  
  307.     }  
  308.   
  309.     // Variables declaration - do not modify                       
  310.     private javax.swing.JButton BUILLD;  
  311.     private javax.swing.JButton CLEAR;  
  312.     private javax.swing.JButton ENDBUT;  
  313.     private javax.swing.JButton ONLINE_USERS;  
  314.     private javax.swing.JList<String> Users1;  
  315.     private javax.swing.JLabel jLabel1;  
  316.     private javax.swing.JPanel jPanel1;  
  317.     private javax.swing.JScrollPane jScrollPane1;  
  318.     private javax.swing.JScrollPane jScrollPane2;  
  319.     private javax.swing.JSeparator jSeparator1;  
  320.     private javax.swing.JTextArea jTextArea1;  
  321.     // End of variables declaration                     
  322. }  
  323.   
  324. clinet(使用者端) :  
  325.   
  326. import java.io.BufferedReader;  
  327. import java.io.IOException;  
  328. import java.io.InputStreamReader;  
  329. import java.io.PrintWriter;  
  330. import java.net.Socket;  
  331. import java.util.*;  
  332. import java.util.logging.Level;  
  333. import java.util.logging.Logger;  
  334. import javax.swing.ImageIcon;  
  335. import javax.swing.JOptionPane;  
  336.   
  337. /* 
  338.  * To change this license header, choose License Headers in Project Properties. 
  339.  * To change this template file, choose Tools | Templates 
  340.  * and open the template in the editor. 
  341.  */  
  342.   
  343. /** 
  344.  * 
  345.  * @author 1 
  346.  */  
  347. public class Clinet extends javax.swing.JFrame {  
  348.     String IP ;  
  349.     LinkedList<String> users = new LinkedList();  
  350.     int port = 7788;  
  351.     Boolean isConnected = false;  
  352.     Socket socket;  
  353.     BufferedReader in;  
  354.     PrintWriter out;  
  355.     String username;  
  356.     public Clinet() {  
  357.         initComponents();  
  358.     }  
  359.     public void IncomingReader(){  
  360.        new Thread(new IncomingReader()).start();  
  361.     }  
  362.     public class IncomingReader implements Runnable{  
  363.        String[] data;  
  364.        String conn = "連接";  
  365.        String exit = "離開";  
  366.        String chat = "聊天";  
  367.        String reset = "重置";  
  368.        String mess , closeData = "";  
  369.         @Override  
  370.         public void run() { //收取伺服器MESS執行諸  
  371.            try {  
  372.                while ((mess = in.readLine()) != null) {  
  373.                     data = mess.split(":");  
  374.                      if(data[2].equals(conn)){//連接  
  375.                          users.add(data[0]);//加入成員  
  376.                      }else if(data[2].equals(exit)&&data[0].equals(username)){//離開  
  377.                          sendExit();  
  378.                          Disconnect();  
  379.                      }else if(data[2].equals(chat)){//訊息  
  380.                          jTextArea1.append(data[0]+":"+ data[1] +"\n");  
  381.                      }else if(data[2].equals(reset)){//重置成員  
  382.                          users = new LinkedList();  
  383.                      }else{  
  384.                          jTextArea1.append("沒有滿足條件 \n");  
  385.                      }  
  386.                }  
  387.            } catch (IOException ex) {  
  388.                ex.printStackTrace();  
  389.                JOptionPane.showMessageDialog(null , "伺服器關閉...." , "訊息" , JOptionPane.WARNING_MESSAGE);  
  390.            }  
  391.         }  
  392.     }  
  393.     @SuppressWarnings("unchecked")  
  394.     // <editor-fold defaultstate="collapsed" desc="Generated Code">                            
  395.     private void initComponents() {  
  396.   
  397.         jTextField1 = new javax.swing.JTextField();  
  398.         jScrollPane1 = new javax.swing.JScrollPane();  
  399.         jTextArea1 = new javax.swing.JTextArea();  
  400.         jButton1 = new javax.swing.JButton();  
  401.         jButton2 = new javax.swing.JButton();  
  402.         jLabel2 = new javax.swing.JLabel();  
  403.         jButton3 = new javax.swing.JButton();  
  404.         jTextField2 = new javax.swing.JTextField();  
  405.         jButton4 = new javax.swing.JButton();  
  406.         jButton5 = new javax.swing.JButton();  
  407.         jLabel1 = new javax.swing.JLabel();  
  408.   
  409.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
  410.         setTitle("使用者");  
  411.         setMaximumSize(new java.awt.Dimension(458580));  
  412.         setMinimumSize(new java.awt.Dimension(458580));  
  413.         setPreferredSize(new java.awt.Dimension(458580));  
  414.         setResizable(false);  
  415.         getContentPane().setLayout(null);  
  416.   
  417.         jTextField1.addActionListener(new java.awt.event.ActionListener() {  
  418.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  419.                 jTextField1ActionPerformed(evt);  
  420.             }  
  421.         });  
  422.         getContentPane().add(jTextField1);  
  423.         jTextField1.setBounds(306012030);  
  424.   
  425.         jTextArea1.setColumns(20);  
  426.         jTextArea1.setRows(5);  
  427.         jScrollPane1.setViewportView(jTextArea1);  
  428.   
  429.         getContentPane().add(jScrollPane1);  
  430.         jScrollPane1.setBounds(10120440378);  
  431.   
  432.         jButton1.setText("登入");  
  433.         jButton1.addActionListener(new java.awt.event.ActionListener() {  
  434.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  435.                 jButton1ActionPerformed(evt);  
  436.             }  
  437.         });  
  438.         getContentPane().add(jButton1);  
  439.         jButton1.setBounds(1807013023);  
  440.   
  441.         jButton2.setText("匿名登入");  
  442.         jButton2.addActionListener(new java.awt.event.ActionListener() {  
  443.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  444.                 jButton2ActionPerformed(evt);  
  445.             }  
  446.         });  
  447.         getContentPane().add(jButton2);  
  448.         jButton2.setBounds(1803013023);  
  449.   
  450.         jLabel2.setFont(new java.awt.Font("微軟正黑體"114)); // NOI18N  
  451.         jLabel2.setText("Name :");  
  452.         getContentPane().add(jLabel2);  
  453.         jLabel2.setBounds(60306020);  
  454.   
  455.         jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/phone-icon (1).png"))); // NOI18N  
  456.         jButton3.addActionListener(new java.awt.event.ActionListener() {  
  457.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  458.                 jButton3ActionPerformed(evt);  
  459.             }  
  460.         });  
  461.         getContentPane().add(jButton3);  
  462.         jButton3.setBounds(3705006050);  
  463.         getContentPane().add(jTextField2);  
  464.         jTextField2.setBounds(1051134030);  
  465.   
  466.         jButton4.setText("離線");  
  467.         jButton4.addActionListener(new java.awt.event.ActionListener() {  
  468.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  469.                 jButton4ActionPerformed(evt);  
  470.             }  
  471.         });  
  472.         getContentPane().add(jButton4);  
  473.         jButton4.setBounds(3207012023);  
  474.   
  475.         jButton5.setText("所有成員");  
  476.         jButton5.addActionListener(new java.awt.event.ActionListener() {  
  477.             public void actionPerformed(java.awt.event.ActionEvent evt) {  
  478.                 jButton5ActionPerformed(evt);  
  479.             }  
  480.         });  
  481.         getContentPane().add(jButton5);  
  482.         jButton5.setBounds(3203012023);  
  483.   
  484.         jLabel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null"使用者", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("微軟正黑體"114))); // NOI18N  
  485.         getContentPane().add(jLabel1);  
  486.         jLabel1.setBounds(100440110);  
  487.   
  488.         pack();  
  489.     }// </editor-fold>                          
  490.   
  491.     private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                              
  492.         // TODO add your handling code here:  
  493.     }                                             
  494.   
  495.     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
  496.        if(!isConnected){  
  497.            try {  
  498.                username = jTextField1.getText();  
  499.                jTextField1.setEditable(false);//設定不可編輯  
  500.                socket = new Socket( IP , port );  
  501.                out  = new PrintWriter(socket.getOutputStream(),true);  
  502.                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  503.                out.println(username + ":"+"已加入聊天"":連接");  
  504.                isConnected = true ;  
  505.            } catch (IOException ex) {  
  506.                 JOptionPane.showMessageDialog(null , "沒連接到伺服器 再試一次.... \n");  
  507.                 jTextField1.setEditable(false);  
  508.            }  
  509.             IncomingReader();  
  510.        }else{  
  511.           JOptionPane.showMessageDialog(null , "你已經登入了 \n");  
  512.        }  
  513.     }                                          
  514.   
  515.     private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
  516.         if(!isConnected){  
  517.            try {  
  518.                int i = (int) (Math.random()*999)+11;      
  519.                username = "Xin"+ i ;  
  520.                jTextField1.setText(username);  
  521.                jTextField1.setEditable(false);//設定不可編輯           
  522.                socket = new Socket( IP , port );  
  523.                out  = new PrintWriter(socket.getOutputStream(),true);  
  524.                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  525.                out.println(username + ":"+"已加入聊天"":連接");  
  526.                isConnected = true;  
  527.                  
  528.            } catch (IOException ex) {  
  529.                 JOptionPane.showMessageDialog(null , "沒連接到伺服器 再試一次.... \n");  
  530.                 jTextField1.setEditable(false);  
  531.            }  
  532.            IncomingReader();  
  533.        }else{  
  534.           JOptionPane.showMessageDialog(null , "你已經登入了 \n" , "訊息" , JOptionPane.QUESTION_MESSAGE);  
  535.        }  
  536.     }                                          
  537.   
  538.      public void sendExit() {  
  539.         String bye = (username + ":已經離開聊天:離開");  
  540.         try  
  541.         {  
  542.             out.println(bye);   
  543.            // out.flush();   
  544.         } catch (Exception e)   
  545.         {  
  546.              JOptionPane.showMessageDialog(null , "再試一次\n""訊息" , JOptionPane.QUESTION_MESSAGE);  
  547.         }  
  548.     }  
  549.        public void Disconnect(){  
  550.         try   
  551.         {  
  552.             JOptionPane.showMessageDialog(null , "已經離開聊天");  
  553.             socket.close();  
  554.         } catch(Exception ex) {  
  555.             JOptionPane.showMessageDialog(null ,"失敗訊息""訊息" , JOptionPane.ERROR_MESSAGE );  
  556.         }  
  557.         isConnected = false;  
  558.         jTextField1.setEditable(true);  
  559.   
  560.     }  
  561.     private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                           
  562.          sendExit();  
  563.          Disconnect();  
  564.     }                                          
  565.   
  566.     private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                           
  567.         String mess = "";  
  568.         if(jTextField2.getText().equals(mess)){  
  569.            jTextField2.setText("");  
  570.         }else{  
  571.               try {  
  572.                out.println(username + ":" + jTextField2.getText() + ":" + "聊天");  
  573.                jTextField2.setText("");  
  574.                 
  575.             } catch (Exception ex) {  
  576.                JOptionPane.showMessageDialog(null"無法寄送....""訊息" , JOptionPane.ERROR_MESSAGE);  
  577.             }  
  578.         }  
  579.        jTextField2.requestFocus();  
  580.     }                                          
  581. ImageIcon member = new ImageIcon("MEMBER.png");  
  582.     private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                           
  583.        String Users = "";  
  584.         for(String user : users )  
  585.             Users+=user+"\n";  
  586.        JOptionPane.showMessageDialog(null, Users, "在線成員", JOptionPane.QUESTION_MESSAGE , member);  
  587.     }                                          
  588.   
  589.     /** 
  590.      * @param args the command line arguments 
  591.      */  
  592.     public static void main(String args[]) {  
  593.        /* Set the Nimbus look and feel */  
  594.         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">  
  595.         /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
  596.          * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html  
  597.          */  
  598.         try {  
  599.             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {  
  600.                 if ("Nimbus".equals(info.getName())) {  
  601.                     javax.swing.UIManager.setLookAndFeel(info.getClassName());  
  602.                     break;  
  603.                 }  
  604.             }  
  605.         } catch (ClassNotFoundException ex) {  
  606.             java.util.logging.Logger.getLogger(Clinet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  607.         } catch (InstantiationException ex) {  
  608.             java.util.logging.Logger.getLogger(Clinet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  609.         } catch (IllegalAccessException ex) {  
  610.             java.util.logging.Logger.getLogger(Clinet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  611.         } catch (javax.swing.UnsupportedLookAndFeelException ex) {  
  612.             java.util.logging.Logger.getLogger(Clinet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
  613.         }  
  614.         //</editor-fold>  
  615.   
  616.         /* Create and display the form */  
  617.         java.awt.EventQueue.invokeLater(new Runnable() {  
  618.             public void run() {  
  619.                 new Clinet().setVisible(true);  
  620.             }  
  621.         });  
  622.     }  
  623.   
  624.     // Variables declaration - do not modify                       
  625.     private javax.swing.JButton jButton1;  
  626.     private javax.swing.JButton jButton2;  
  627.     private javax.swing.JButton jButton3;  
  628.     private javax.swing.JButton jButton4;  
  629.     private javax.swing.JButton jButton5;  
  630.     private javax.swing.JLabel jLabel1;  
  631.     private javax.swing.JLabel jLabel2;  
  632.     private javax.swing.JScrollPane jScrollPane1;  
  633.     private javax.swing.JTextArea jTextArea1;  
  634.     private javax.swing.JTextField jTextField1;  
  635.     private javax.swing.JTextField jTextField2;  
  636.     // End of variables declaration                     
  637. }