一个简单的聊天程序

来源:互联网 发布:浙江手工艺品网络 编辑:程序博客网 时间:2024/05/13 05:58

一个简单的聊天程序(含服务器端和客户端),支持键盘(ENTER)按下发送信息。

服务器端代码:

Code:
  1. package myclass.cart;   
  2.   
  3. import java.awt.*;   
  4. import java.awt.event.*;   
  5. import javax.swing.*;   
  6. import javax.swing.border.*;   
  7. import java.io.ObjectOutputStream;   
  8. import java.io.*;   
  9.   
  10. /**  
  11.  * <p>Title: 服务器端</p>  
  12.  * <p>Description:服务器端程序 </p>  
  13.  * <p>Copyright: Copyright (c) 2010</p>  
  14.  * <p>Company: </p>  
  15.  * @author not attributable  
  16.  * @version 1.0  
  17.  */  
  18.   
  19. public class ServerFrame extends JFrame {   
  20.   JPanel contentPane;   
  21.   TitledBorder titledBorder1;   
  22.   TitledBorder titledBorder2;   
  23.   JScrollPane jScrollPane1 = new JScrollPane();   
  24.   JTextField jTextField1 = new JTextField();   
  25.   JButton jButton1 = new JButton();   
  26.   JEditorPane jEditorPane1 = new JEditorPane();   
  27.   TitledBorder titledBorder3;   
  28.   private ObjectOutputStream out;   
  29.   //Construct the frame   
  30.   public ServerFrame() {   
  31.     enableEvents(AWTEvent.WINDOW_EVENT_MASK);   
  32.     try {   
  33.       jbInit();   
  34.     }   
  35.     catch(Exception e) {   
  36.       e.printStackTrace();   
  37.     }   
  38.   }   
  39.   //Component initialization   
  40.   private void jbInit() throws Exception  {   
  41.     contentPane = (JPanel) this.getContentPane();   
  42.     titledBorder1 = new TitledBorder("");   
  43.     titledBorder2 = new TitledBorder("");   
  44.     titledBorder3 = new TitledBorder("");   
  45.     contentPane.setLayout(null);   
  46.     this.setSize(new Dimension(410340));   
  47.     this.setTitle("服务器");   
  48.     this.setResizable(false);   
  49.     this.addWindowListener(new WindowAdapter() {   
  50.            public void windowClosing(WindowEvent e) {   
  51.              if(out!=null){   
  52.               try {   
  53.                 out.writeObject(Constant.CONNECT_QUIT);   
  54.                 out.flush();   
  55.               }   
  56.               catch (IOException ex) {   
  57.               }   
  58.   
  59.              }   
  60.            }   
  61.          });   
  62.     jScrollPane1.setBorder(BorderFactory.createEtchedBorder());   
  63.     jScrollPane1.setBounds(new Rectangle(22405252));   
  64.     jTextField1.setBorder(titledBorder2);   
  65.     jTextField1.setText("");   
  66.     jTextField1.setBounds(new Rectangle(527030925));   
  67.     jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {   
  68.       public void keyPressed(KeyEvent e) {   
  69.         jTextField1_keyPressed(e);   
  70.       }   
  71.     });   
  72.     jButton1.setBounds(new Rectangle(3232667734));   
  73.     jButton1.setFont(new java.awt.Font("Dialog"015));   
  74.     jButton1.setForeground(Color.blue);   
  75.     jButton1.setText("发送");   
  76.     jButton1.addActionListener(new java.awt.event.ActionListener() {   
  77.       public void actionPerformed(ActionEvent e) {   
  78.         jButton1_actionPerformed(e);   
  79.       }   
  80.     });   
  81.     jEditorPane1.setText("");   
  82.     contentPane.add(jScrollPane1, null);   
  83.     contentPane.add(jButton1, null);   
  84.     contentPane.add(jTextField1, null);   
  85.     jScrollPane1.getViewport().add(jEditorPane1, null);   
  86.   }   
  87.   //Overridden so we can exit when window is closed   
  88.   protected void processWindowEvent(WindowEvent e) {   
  89.     super.processWindowEvent(e);   
  90.     if (e.getID() == WindowEvent.WINDOW_CLOSING) {   
  91.       System.exit(0);   
  92.     }   
  93.   }   
  94.   
  95.   public void showMessage(String mess){   
  96.     jEditorPane1.setText(jEditorPane1.getText()+mess+"/n");   
  97.     jEditorPane1.setCaretPosition(jEditorPane1.getText().length());   
  98.   }   
  99.   
  100.   public void setOut(ObjectOutputStream out){   
  101.     this.out=out;   
  102.   }   
  103.   
  104.   void jButton1_actionPerformed(ActionEvent e) {   
  105.     try {   
  106.       out.writeObject("服务器>>" + jTextField1.getText());   
  107.       out.flush();   
  108.       jTextField1.setText("");   
  109.     }   
  110.     catch (IOException ex) {   
  111.     }   
  112.   
  113.   }   
  114.   
  115.   void jTextField1_keyPressed(KeyEvent e) {   
  116.     if(e.getKeyCode()==KeyEvent.VK_ENTER){   
  117.       try {   
  118.          out.writeObject("服务器>>" + jTextField1.getText());   
  119.          out.flush();   
  120.          jTextField1.setText("");   
  121.        }   
  122.        catch (IOException ex) {   
  123.        }   
  124.   
  125.     }   
  126.   }   
  127. }  
Code:
  1. package myclass.cart;   
  2.   
  3. import javax.swing.UIManager;   
  4. import java.awt.*;   
  5. import java.net.Socket;   
  6. import java.net.ServerSocket;   
  7. import java.io.*;   
  8. import javax.swing.JOptionPane;   
  9.   
  10. /**  
  11.  * <p>Title: </p>  
  12.  * <p>Description: </p>  
  13.  * <p>Copyright: Copyright (c) 2010</p>  
  14.  * <p>Company: </p>  
  15.  * @author not attributable  
  16.  * @version 1.0  
  17.  */  
  18.   
  19. public class Server {   
  20.   public  ServerFrame frame;   
  21.   boolean packFrame = false;   
  22.   private ServerSocket serverSocket;   
  23.   private Socket socket;   
  24.   private ObjectOutputStream out;   
  25.   private ObjectInputStream in;   
  26.   //Construct the application   
  27.   public Server() {   
  28.     frame = new ServerFrame();   
  29.     //Validate frames that have preset sizes   
  30.     //Pack frames that have useful preferred size info, e.g. from their layout   
  31.     if (packFrame) {   
  32.       frame.pack();   
  33.     }   
  34.     else {   
  35.       frame.validate();   
  36.     }   
  37.     //Center the window   
  38.     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();   
  39.     Dimension frameSize = frame.getSize();   
  40.     if (frameSize.height > screenSize.height) {   
  41.       frameSize.height = screenSize.height;   
  42.     }   
  43.     if (frameSize.width > screenSize.width) {   
  44.       frameSize.width = screenSize.width;   
  45.     }   
  46.     frame.setLocation( (screenSize.width - frameSize.width) / 2,   
  47.                       (screenSize.height - frameSize.height) / 2);   
  48.     frame.setVisible(true);   
  49.     //启动服务器   
  50.     startServer();   
  51.   }   
  52.   
  53.   public void startServer() {   
  54.     try {   
  55.       frame.showMessage("服务器开始启动,等待连接...");   
  56.       serverSocket = new ServerSocket(Constant.LISTEN_PORT);   
  57.       socket = serverSocket.accept();   
  58.       //建立连接   
  59.       frame.showMessage("已与客户端" + socket.getInetAddress().getHostName() +   
  60.                         "建立连接!");   
  61.       frame.showMessage("----------------------------------------------------");   
  62.       while (true) {   
  63.         //ServerThread st = new ServerThread(socket);   
  64.         //st.start();   
  65.         try {   
  66.      out = new ObjectOutputStream(socket.getOutputStream());   
  67.     frame.setOut(out);   
  68.     out.flush();   
  69.     //保持通信   
  70.      in=new ObjectInputStream(socket.getInputStream());   
  71.     String message="";   
  72.     while(true){   
  73.       try {   
  74.         message = (String) in.readObject();   
  75.         if(message.equals(Constant.CONNECT_QUIT)){   
  76.           frame.setOut(null);   
  77.           break;   
  78.         }   
  79.        // JOptionPane.showMessageDialog(null,"server");   
  80.         frame.showMessage(message);   
  81.       }   
  82.       catch (ClassNotFoundException ex1) {   
  83.       }   
  84.       catch (IOException ex1) {   
  85.       }   
  86.     }   
  87.        frame.showMessage("客户端"+socket.getInetAddress().getHostName()+"中断了连接!");   
  88.        in.close();   
  89.        out.close();   
  90.        socket.close();   
  91.   
  92. }   
  93. catch (SecurityException ex) {   
  94. }   
  95. catch (IOException ex) {   
  96. }   
  97.   
  98.       }   
  99.     }   
  100.     catch (IOException ex) {   
  101.     }   
  102.   }   
  103.   
  104.   //Main method   
  105.   public static void main(String[] args) {   
  106.     try {   
  107.       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());   
  108.       // UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");   
  109.     }   
  110.     catch (Exception e) {   
  111.       e.printStackTrace();   
  112.     }   
  113.     new Server();   
  114.   }   
  115.   
  116. //使用线程来处理有点问题   
  117.  /* class ServerThread extends Thread{  
  118. Socket c;  
  119. ServerThread(Socket t){  
  120.   c=t;  
  121. }  
  122. public void run(){  
  123. try {  
  124.     ObjectOutputStream out = new ObjectOutputStream(c.getOutputStream());  
  125.     frame.setOut(out);  
  126.     out.flush();  
  127.     //保持通信  
  128.    ObjectInputStream  in=new ObjectInputStream(c.getInputStream());  
  129.     String message="";  
  130.     while(true){  
  131.       try {  
  132.         message = (String) in.readObject();  
  133.         if(message.equals(Constant.CONNECT_QUIT)){  
  134.           frame.setOut(null);  
  135.           break;  
  136.         }  
  137.         frame.showMessage(message);  
  138.       }  
  139.       catch (ClassNotFoundException ex1) {  
  140.       }  
  141.       catch (IOException ex1) {  
  142.       }  
  143.     }  
  144.        frame.showMessage("客户端"+c.getInetAddress().getHostName()+"中断了连接!");  
  145.        in.close();  
  146.        out.close();  
  147.        socket.close();  
  148.  
  149. }  
  150. catch (SecurityException ex) {  
  151. }  
  152. catch (IOException ex) {  
  153. }  
  154.  
  155. }  
  156. }  
  157. */  
  158. }   
  159.   
  160.   
  161.   

客户端代码:

Code:
  1. package myclass.cart;   
  2.   
  3. import java.awt.*;   
  4. import java.awt.event.*;   
  5. import javax.swing.*;   
  6. import javax.swing.border.*;   
  7. import java.io.ObjectOutputStream;   
  8. import java.io.*;   
  9.   
  10. /**  
  11.  * <p>Title: 客户端</p>  
  12.  * <p>Description:客户端程序 </p>  
  13.  * <p>Copyright: Copyright (c) 2010</p>  
  14.  * <p>Company: </p>  
  15.  * @author not attributable  
  16.  * @version 1.0  
  17.  */  
  18. public class ClientFrame extends JFrame {   
  19. JPanel contentPane;   
  20. TitledBorder titledBorder1;   
  21. TitledBorder titledBorder2;   
  22. JScrollPane jScrollPane1 = new JScrollPane();   
  23. JTextField jTextField1 = new JTextField();   
  24. JButton jButton1 = new JButton();   
  25. JEditorPane jEditorPane1 = new JEditorPane();   
  26. TitledBorder titledBorder3;   
  27. private ObjectOutputStream out;   
  28. //Construct the frame   
  29. public ClientFrame() {   
  30. enableEvents(AWTEvent.WINDOW_EVENT_MASK);   
  31. try {   
  32.   jbInit();   
  33. }   
  34. catch(Exception e) {   
  35.   e.printStackTrace();   
  36. }   
  37. }   
  38. //Component initialization   
  39. private void jbInit() throws Exception  {   
  40. contentPane = (JPanel) this.getContentPane();   
  41. titledBorder1 = new TitledBorder("");   
  42. titledBorder2 = new TitledBorder("");   
  43. titledBorder3 = new TitledBorder("");   
  44. contentPane.setLayout(null);   
  45. this.setSize(new Dimension(410340));   
  46. this.setTitle("客户端");   
  47. this.setResizable(false);   
  48. this.addWindowListener(new WindowAdapter() {   
  49.        public void windowClosing(WindowEvent e) {   
  50.          if(out!=null){   
  51.           try {   
  52.             out.writeObject(Constant.CONNECT_QUIT);   
  53.             out.flush();   
  54.           }   
  55.           catch (IOException ex) {   
  56.           }   
  57.   
  58.          }   
  59.        }   
  60.      });   
  61. jScrollPane1.setBorder(BorderFactory.createEtchedBorder());   
  62. jScrollPane1.setBounds(new Rectangle(22405252));   
  63. jTextField1.setBorder(titledBorder2);   
  64. jTextField1.setText("");   
  65. jTextField1.setBounds(new Rectangle(527030925));   
  66.     jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {   
  67.       public void keyPressed(KeyEvent e) {   
  68.         jTextField1_keyPressed(e);   
  69.       }   
  70.     });   
  71. jButton1.setBounds(new Rectangle(3232667734));   
  72. jButton1.setFont(new java.awt.Font("Dialog"015));   
  73. jButton1.setForeground(Color.blue);   
  74. jButton1.setText("发送");   
  75. jButton1.addActionListener(new java.awt.event.ActionListener() {   
  76.   public void actionPerformed(ActionEvent e) {   
  77.     jButton1_actionPerformed(e);   
  78.   }   
  79. });   
  80. jEditorPane1.setText("");   
  81. contentPane.add(jScrollPane1, null);   
  82. contentPane.add(jButton1, null);   
  83. contentPane.add(jTextField1, null);   
  84. jScrollPane1.getViewport().add(jEditorPane1, null);   
  85. }   
  86. //Overridden so we can exit when window is closed   
  87. protected void processWindowEvent(WindowEvent e) {   
  88. super.processWindowEvent(e);   
  89. if (e.getID() == WindowEvent.WINDOW_CLOSING) {   
  90.   System.exit(0);   
  91. }   
  92. }   
  93.   
  94. public void showMessage(String mess){   
  95. jEditorPane1.setText(jEditorPane1.getText()+mess+"/n");   
  96. jEditorPane1.setCaretPosition(jEditorPane1.getText().length());   
  97. }   
  98.   
  99. public void setOut(ObjectOutputStream out){   
  100. this.out=out;   
  101. }   
  102.   
  103. void jButton1_actionPerformed(ActionEvent e) {   
  104.   try {   
  105.     out.writeObject("客户端>>" + jTextField1.getText());   
  106.      out.flush();   
  107.      jTextField1.setText("");   
  108.   }   
  109.   catch (IOException ex) {   
  110.   }   
  111.   
  112. }   
  113.   
  114.   void jTextField1_keyPressed(KeyEvent e) {   
  115.     if(e.getKeyCode()==KeyEvent.VK_ENTER){   
  116.         try {   
  117.            out.writeObject("服务器>>" + jTextField1.getText());   
  118.            out.flush();   
  119.            jTextField1.setText("");   
  120.          }   
  121.          catch (IOException ex) {   
  122.          }   
  123.   
  124.       }   
  125.   
  126.   }   
  127.   
  128. }   
  129.   
Code:
  1. package myclass.cart;   
  2. import javax.swing.UIManager;   
  3. import java.awt.*;   
  4. import java.io.ObjectOutputStream;   
  5. import java.io.ObjectInputStream;   
  6. import java.net.Socket;   
  7. import java.io.*;   
  8. import javax.swing.JOptionPane;   
  9.   
  10. /**  
  11.  * <p>Title: </p>  
  12.  * <p>Description: </p>  
  13.  * <p>Copyright: Copyright (c) 2010</p>  
  14.  * <p>Company: </p>  
  15.  * @author not attributable  
  16.  * @version 1.0  
  17.  */  
  18.   
  19. public class Cilent {   
  20.   boolean packFrame = false;   
  21.   private ClientFrame frame;   
  22.   private ObjectOutputStream out;   
  23.   private ObjectInputStream in;   
  24.   private Socket socket;   
  25.   
  26.   //Construct the application   
  27.   public Cilent() {   
  28.      frame = new ClientFrame();   
  29.     //Validate frames that have preset sizes   
  30.     //Pack frames that have useful preferred size info, e.g. from their layout   
  31.     if (packFrame) {   
  32.       frame.pack();   
  33.     }   
  34.     else {   
  35.       frame.validate();   
  36.     }   
  37.     //Center the window   
  38.     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();   
  39.     Dimension frameSize = frame.getSize();   
  40.     if (frameSize.height > screenSize.height) {   
  41.       frameSize.height = screenSize.height;   
  42.     }   
  43.     if (frameSize.width > screenSize.width) {   
  44.       frameSize.width = screenSize.width;   
  45.     }   
  46.     frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);   
  47.     frame.setVisible(true);   
  48.     startClient();   
  49.   }   
  50.   
  51.   public void startClient(){   
  52.     try {   
  53.      frame.showMessage("连接中...");   
  54.       socket = new Socket(Constant.SERVER_HOST, Constant.LISTEN_PORT);   
  55.       //建立连接   
  56.       frame.showMessage("连接至" + socket.getInetAddress().getHostName());   
  57.       frame.showMessage("----------------------------------------------------");   
  58.       out = new ObjectOutputStream(socket.getOutputStream());   
  59.       frame.setOut(out);   
  60.   
  61.   
  62.       //保持通信   
  63.       in=new ObjectInputStream(socket.getInputStream());   
  64.       String message="";   
  65.       while(true){   
  66.         try {   
  67.           message = (String) in.readObject();   
  68.           if(message.equals(Constant.CONNECT_QUIT)){   
  69.             frame.setOut(null);   
  70.             break;   
  71.           }   
  72.            frame.showMessage(message);   
  73.         }   
  74.         catch (ClassNotFoundException ex1) {   
  75.         }   
  76.         catch (IOException ex1) {   
  77.         }   
  78.       }   
  79.   
  80.       //结束连接   
  81.     frame.showMessage("服务器已经断开!");   
  82.     out.close();   
  83.     in.close();   
  84.     socket.close();   
  85.   
  86.     }   
  87.     catch (IOException ex) {   
  88.     }   
  89.   }   
  90.   //Main method   
  91.   public static void main(String[] args) {   
  92.     try {   
  93.       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());   
  94.     }   
  95.     catch(Exception e) {   
  96.       e.printStackTrace();   
  97.     }   
  98.     new Cilent();   
  99.   }   
  100. }   

一些公用的参数代码:

Code:
  1. package myclass.cart;   
  2.   
  3. /**  
  4.  * <p>Title: 服务器与客户端使用常数</p>  
  5.  * <p>Description: </p>  
  6.  * <p>Copyright: Copyright (c) 2010</p>  
  7.  * <p>Company: </p>  
  8.  * @author not attributable  
  9.  * @version 1.0  
  10.  */  
  11.   
  12. public class Constant {   
  13.   public static final String SERVER_HOST = "127.0.0.1"//服务器主机   
  14.   public static final int LISTEN_PORT = 8000;   //监听端口号   
  15.   public static final String CONNECT_QUIT = "quit"//退出连接标志   
  16.   
  17. }  

 

原创粉丝点击