现在的位置: 首页代码如诗, 计算机>正文
Java在线聊天室(源代码)
发表于136 天前 代码如诗, 计算机 评论数 1 ⁄ 被围观 514 views+

Java Swing的界面,在线聊天室,一共三个类ChatRoomServer、 ChatRoomGUI和ChatRoomClient,其中ChatRoomServer和 ChatRoomGUI可以运行,运行时,先运行ChatRoomServer类,然后运行ChatRoomGUI类。

 ChatRoomServer类

  1. package com.zuoshangs.code.chatroom;   
  2.   
  3. import java.io.BufferedReader;   
  4. import java.io.IOException;   
  5. import java.io.InputStreamReader;   
  6. import java.io.PrintWriter;   
  7. import java.net.ServerSocket;   
  8. import java.net.Socket;   
  9. import java.util.HashMap;   
  10. import java.util.Map;   
  11.   
  12. public class ChatRoomServer {   
  13.     private ServerSocket ss;   
  14.     private Map<String,Socket> allOnlineUser;   
  15.        
  16.     public ChatRoomServer(){   
  17.         try {   
  18.             ss=new ServerSocket(8989);   
  19.             allOnlineUser=new HashMap<String,Socket>();   
  20.         } catch (IOException e) {   
  21.             e.printStackTrace();   
  22.         }   
  23.     }   
  24.        
  25.     public void startService(){   
  26.         while(true){   
  27.             try {   
  28.                 Socket s=ss.accept();   
  29.                 new ChatRoomServerThread(s).start();   
  30.             } catch (IOException e) {   
  31.                 e.printStackTrace();   
  32.             }   
  33.         }   
  34.     }   
  35.        
  36.     public static void main(String[] args){   
  37.         new ChatRoomServer().startService();   
  38.     }   
  39.        
  40.        
  41.     class ChatRoomServerThread extends Thread{   
  42.         private Socket s;   
  43.         private BufferedReader br;   
  44.         private PrintWriter pw;   
  45.            
  46.         public ChatRoomServerThread(Socket s){   
  47.             this.s=s;   
  48.             try {   
  49.                 pw=new PrintWriter(s.getOutputStream());   
  50.                 br=new BufferedReader(new InputStreamReader(s.getInputStream()));   
  51.             } catch (IOException e) {   
  52.                 e.printStackTrace();   
  53.             }   
  54.         }   
  55.         public void run(){   
  56.             try {   
  57.                 while(true){   
  58.                     String mes=br.readLine();   
  59.                     if(mes.indexOf(“%LOGIN%”)==0){   
  60.                         String userName=mes.split(“:”)[1];   
  61.                         if(allOnlineUser.containsKey(userName)){   
  62.                             pw.println(“LOGIN_FAIL”);   
  63.                             pw.flush();   
  64.                         }else{   
  65.                             allOnlineUser.put(mes.split(“:”)[1],s);   
  66.                             pw.println(“LOGIN_OK”);   
  67.                             pw.flush();   
  68.                             sendCurrentUserList();   
  69.                         }   
  70.                     }else if(mes.indexOf(“%MESS%”)==0){   
  71.                         sendMessage(mes);   
  72.                            
  73.                     }else if(mes.indexOf(“%EXIT%”)==0){   
  74.                         allOnlineUser.remove(mes.split(“:”)[1]);   
  75.                         sendCurrentUserList();   
  76.                         break;   
  77.                     }   
  78.                 }   
  79.             } catch (Exception e) {   
  80.                 e.printStackTrace();   
  81.             }finally{   
  82.                 if(s!=null)try{s.close();}catch(IOException e){}   
  83.             }   
  84.                
  85.         }   
  86.            
  87.         public void sendMessage(String mesg)throws IOException{   
  88.             String toUser=mesg.split(“:”)[2];   
  89.             if(toUser.equals(“所有人”)){   
  90.                 for(Socket temp:allOnlineUser.values()){   
  91.                     PrintWriter pw=new PrintWriter(temp.getOutputStream());   
  92.                     pw.println(mesg);   
  93.                     pw.flush();   
  94.                 }   
  95.             }else{   
  96.                 Socket temps=allOnlineUser.get(toUser);   
  97.                 if(temps==null){   
  98.                     System.out.println(“人名未找到!”);   
  99.                     return ;   
  100.                 }   
  101.                 PrintWriter pw=new PrintWriter(temps.getOutputStream());   
  102.                 pw.println(mesg);   
  103.                 pw.flush();   
  104.                    
  105.             }   
  106.                
  107.         }   
  108.            
  109.         public void sendCurrentUserList()throws IOException{   
  110.             StringBuffer sb=new StringBuffer();   
  111.             for(String str:allOnlineUser.keySet()){   
  112.                 sb.append(str+“,”);   
  113.             }   
  114.             for(Socket temp:allOnlineUser.values()){   
  115.                 PrintWriter pw=new PrintWriter(temp.getOutputStream());   
  116.                 pw.println(“%USER_LIST%:”+sb.toString());   
  117.                 pw.flush();   
  118.             }   
  119.         }   
  120.            
  121.     }   
  122.   
  123. }   

ChatRoomGUI类

  1. package com.zuoshangs.code.chatroom;   
  2.   
  3. import java.awt.BorderLayout;   
  4. import java.awt.Color;   
  5. import java.awt.event.ActionEvent;   
  6. import java.awt.event.ActionListener;   
  7. import java.awt.event.WindowAdapter;   
  8. import java.awt.event.WindowEvent;   
  9. import java.util.Date;   
  10. import java.util.HashSet;   
  11. import java.util.List;   
  12. import java.util.Set;   
  13.   
  14. import javax.swing.BoxLayout;   
  15. import javax.swing.JButton;   
  16. import javax.swing.JComboBox;   
  17. import javax.swing.JFrame;   
  18. import javax.swing.JLabel;   
  19. import javax.swing.JOptionPane;   
  20. import javax.swing.JPanel;   
  21. import javax.swing.JScrollPane;   
  22. import javax.swing.JTextArea;   
  23. import javax.swing.JTextField;   
  24.   
  25. public class ChatRoomGUI extends JFrame implements ActionListener{   
  26.     private static final long serialVersionUID = 1L;   
  27.     private JTextArea area;   
  28.     private JButton send;   
  29.     private JTextField field;   
  30.     private JLabel label;   
  31.     private ChatRoomClient client;   
  32.     private String currentUser;   
  33.     private String[] onLineUserList;   
  34.     private JComboBox box;   
  35.     private JPanel eastPanel;   
  36.     private Boolean flag=null;   
  37.        
  38.     public ChatRoomGUI(){   
  39.         super(“网络聊天室客户端v1.0″);   
  40.         client=new ChatRoomClient(“127.0.0.1″,8989);   
  41.        
  42.         do {   
  43.             currentUser = JOptionPane.showInputDialog(“请输入用户名:”);   
  44.             client.send(“%LOGIN%:”+currentUser);   
  45.             String str=client.read();   
  46.             if(str.equals(“LOGIN_OK”)){   
  47.                 break;   
  48.             }   
  49.             JOptionPane.showMessageDialog(this, currentUser+“用户名已经存在,请重新输入!”);   
  50.         } while (true);    
  51.            
  52.            
  53.         area=new JTextArea(20,40);   
  54.         send=new JButton(“发送”);   
  55.         field=new JTextField(25);   
  56.         label=new JLabel(currentUser+“:”);   
  57.            
  58.         box=new JComboBox();   
  59.            
  60.         onLineUserList=new String[0];   
  61.         init();   
  62.         addEventHandler();   
  63.            
  64.     }   
  65.        
  66.     private void init(){   
  67.         JScrollPane jsp=new JScrollPane(area);   
  68.         JPanel panel=new JPanel();   
  69.            
  70.         eastPanel=new JPanel();   
  71.         eastPanel.setLayout(new BoxLayout(eastPanel,BoxLayout.Y_AXIS));   
  72.         JScrollPane jsp2=new JScrollPane(eastPanel);   
  73.         refreshGUIUserList();   
  74.            
  75.         panel.add(label);   
  76.         panel.add(new JLabel(“对”));   
  77.         panel.add(box);   
  78.         panel.add(new JLabel(“说:”));   
  79.         panel.add(field);   
  80.         panel.add(send);   
  81.            
  82.         this.add(jsp,BorderLayout.CENTER);   
  83.         this.add(panel,BorderLayout.SOUTH);   
  84.         this.add(jsp2,BorderLayout.EAST);   
  85.     }   
  86.        
  87.     class ButtonAction implements ActionListener{   
  88.         public void actionPerformed(ActionEvent e) {   
  89.             String userName=e.getActionCommand();   
  90.             box.setSelectedItem(userName);   
  91.         }   
  92.     }   
  93.        
  94.     public void actionPerformed(ActionEvent e) {   
  95.         String str=field.getText();   
  96.         if(str==null || str.trim().equals(“”)){   
  97.             JOptionPane.showMessageDialog(this“不能发送空消息!”);   
  98.         }   
  99.         client.send(“%MESS%:”+currentUser+“:”+box.getSelectedItem()+“:”+str);   
  100.         field.setText(“”);   
  101.            
  102.     }   
  103.   
  104.     private void addEventHandler(){   
  105.         send.addActionListener(this);   
  106.         field.addActionListener(this);   
  107.         this.addWindowListener(new WindowAdapter(){   
  108.             public void windowClosing(WindowEvent e) {   
  109.                 int op=JOptionPane.showConfirmDialog(ChatRoomGUI.this,“确定要退出聊天室吗?”,“确认退出”,JOptionPane.OK_CANCEL_OPTION);   
  110.                 if(op==JOptionPane.OK_OPTION){   
  111.                     client.send(“%EXIT%:”+currentUser);   
  112.                     try {   
  113.                         Thread.sleep(300);   
  114.                     } catch (InterruptedException e1) {   
  115.                         e1.printStackTrace();   
  116.                     }   
  117.                     System.exit(0);   
  118.                 }   
  119.             }   
  120.         });   
  121.     }   
  122.        
  123.     public void showMe(){   
  124.         this.pack();   
  125.         this.setVisible(true);   
  126.         this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   
  127.         new ReadMessageThread().start();   
  128.     }   
  129.        
  130.     public static void main(String[] arfs){   
  131.         new ChatRoomGUI().showMe();   
  132.     }   
  133.        
  134.        
  135.     public void refreshGUIUserList(){   
  136.         box.removeAllItems();   
  137.         box.addItem(“所有人”);   
  138.         for(String user:onLineUserList){   
  139.             box.addItem(user);   
  140.         }   
  141.            
  142.         eastPanel.removeAll();   
  143.            
  144.         eastPanel.add(new JLabel(“在线用户列表:”));   
  145.         JButton button;   
  146.         ActionListener lis=new ButtonAction();   
  147.         eastPanel.add(button=new JButton(“所有人”));   
  148.         button.setBackground(Color.WHITE);   
  149.         button.addActionListener(lis);   
  150.         for(String user:onLineUserList){   
  151.             eastPanel.add(button=new JButton(user));   
  152.             button.setBackground(Color.WHITE);   
  153.             button.addActionListener(lis);   
  154.         }   
  155.            
  156.     }   
  157.        
  158.     class ReadMessageThread extends Thread{   
  159.         public void run(){   
  160.             while(true){   
  161.                 System.out.println(“Thread start!”);   
  162.                 String mesg=client.read();   
  163.                 String[] ss=mesg.split(“:”);   
  164.                    
  165.                 if(ss[0].equals(“%MESS%”)){   
  166.                     area.append(mesg+“\n”);   
  167.                 }else if(ss[0].equals(“%USER_LIST%”)){   
  168.                     onLineUserList=ss[1].split(“,”);   
  169.                     refreshGUIUserList();   
  170.                 }   
  171.             }   
  172.         }   
  173.     }   
  174. }   

 

ChatRoomClient类

  1. package com.zuoshangs.code.chatroom;   
  2.   
  3. import java.io.BufferedReader;   
  4. import java.io.IOException;   
  5. import java.io.InputStreamReader;   
  6. import java.io.PrintWriter;   
  7. import java.net.Socket;   
  8. import java.net.UnknownHostException;   
  9.   
  10. public class ChatRoomClient {   
  11.     private Socket s;   
  12.     private BufferedReader br;   
  13.     private PrintWriter pw;   
  14.        
  15.     public ChatRoomClient(String host,int port){   
  16.         try {   
  17.             s=new Socket(host,port);   
  18.             br=new BufferedReader(new InputStreamReader(s.getInputStream()));   
  19.             pw=new PrintWriter(s.getOutputStream());   
  20.         } catch (UnknownHostException e) {   
  21.             e.printStackTrace();   
  22.         } catch (IOException e) {   
  23.             e.printStackTrace();   
  24.         }   
  25.     }   
  26.        
  27.     public void send(String mesg){   
  28.         pw.println(mesg);   
  29.         pw.flush();   
  30.            
  31.     }   
  32.        
  33.     public String read(){   
  34.         try {   
  35.             return br.readLine();   
  36.         } catch (Exception e) {   
  37.             e.printStackTrace();   
  38.         }   
  39.         return null;   
  40.     }   
  41.   
  42. }   

无觅相关文章插件,快速提升流量

目前有 1 条留言 其中:访客:1 条, 博主:0 条

  1. 免费诊股 : 2012年01月16日上午 9:50 回复

    谢谢博主了!!复制走啦!!

给我留言

留言无头像?


使用腾讯微博登陆

使用新浪微博登陆

最活跃的读者

Klamiory(留下1个脚印)

订阅本站

分类目录

广而告知

最新评论

网站统计

    日志总数:41篇
    评论总数:594条
    分类总数:7个
    标签总数:374个
    友情链接:3个
    网站运行:1697天
最后更新:2011年12月25日