用java写的基于Socket的简单即时通讯程序

来源:互联网 发布:免费商城源码 编辑:程序博客网 时间:2024/04/27 14:04

  1. /**//* 
  2.  *服务端 
  3.  */  
  4. package edu.jlu.cpp;  
  5.   
  6. import java.io.*;  
  7. import java.net.*;  
  8. import java.awt.event.ActionEvent;  
  9. import java.awt.event.ActionListener;  
  10. import java.awt.event.KeyAdapter;  
  11. import java.awt.event.KeyEvent;  
  12.   
  13. import javax.swing.*;  
  14.   
  15. public class Server extends JFrame implements Runnable {  
  16.  private ServerSocket server;  
  17.  private Socket connection;  
  18.  private OutputStream output;  
  19.  private InputStream input;  
  20.  private Thread outThread;  
  21.  private JTextArea display;  
  22.  private JTextField text1;  
  23.  private JButton startButton;  
  24.    
  25.  public static void main(String args[]) {  
  26.   Server s = new Server();  
  27.   s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  28.  }  
  29.   
  30.  public Server() {  
  31.   super("Server");  
  32.   startButton = new JButton("Start the server");  
  33.   text1 = new JTextField(20);  
  34.   display = new JTextArea(730);  
  35.   display.setEditable(false);  
  36.  Container container = getContentPane();  
  37.   container.setLayout(new BorderLayout());  
  38.   container.add(startButton,BorderLayout.NORTH);  
  39.   container.add(new JScrollPane(display),BorderLayout.CENTER);  
  40.   container.add(text1,BorderLayout.SOUTH);   
  41.   
  42.  /**//* 
  43.    * 给开始按钮添加监听器。 
  44.    */  
  45.   startButton.addActionListener(new ActionListener(){  
  46.    public void actionPerformed(ActionEvent e) {  
  47.     display.setText("启动服务器 ");  
  48.     startButton.setEnabled(false);  
  49.     try {  
  50.      //端口设为5000,最大连接请求为100个  
  51.      server = new ServerSocket(5000100);  
  52.      connection = server.accept();  
  53.      output = connection.getOutputStream();  
  54.      input = connection.getInputStream();  
  55.      output.write("连接成功! ".getBytes());  
  56.      outThread = new Thread(Server.this);  
  57.      outThread.start();  
  58.      } catch (IOException ee) {  
  59.     }  
  60.    }  
  61.   });  
  62.     
  63.   /**//* 
  64.   /*给文本域添加键盘监听器,按回车发送信息。 
  65.         */  
  66.     
  67.   text1.addKeyListener(new KeyAdapter(){  
  68.    public void keyPressed(KeyEvent ke) {  
  69.     if(ke.getKeyCode() == KeyEvent.VK_ENTER){  
  70.      byte writeBytes[] = new byte[50];  
  71.      String s = "Server: " + text1.getText() + "";  
  72.      text1.setText("");  
  73.      writeBytes = s.getBytes();  
  74.      display.append(s+" ");  
  75.      try {  
  76.       output.write(writeBytes);  
  77.      } catch (IOException ee) {  
  78.      }  
  79.      if (s.trim().equals("Server: exit")) {  
  80.       outThread.stop();  
  81.       quit();  
  82.      }  
  83.     }  
  84.    }  
  85.   });  
  86.   setSize(300400);  
  87.   setResizable(false);  
  88.   setVisible(true);  
  89.  }  
  90.   
  91.  public void run() {  
  92.   while (true) {  
  93.    byte readBytes[] = new byte[50];  
  94.    try {  
  95.     input.read(readBytes);//读去对方发送的消息  
  96.    } catch (IOException e) {  
  97.    }  
  98.    String s = new String(readBytes);  
  99.    display.append(s+" ");  
  100.    if (s.trim().equals("Client: exit"))  
  101.     break;  
  102.   }  
  103.   quit();  
  104.  }  
  105.   
  106.  public void quit() {  
  107.   try {  
  108.    output.close();  
  109.    input.close();  
  110.    connection.close();  
  111.   } catch (IOException e) {  
  112.   }  
  113.   startButton.setEnabled(true);  
  114.  }  
  115. }  
  116. /**//* 
  117.  *客户端 
  118.  */  
  119. package edu.jlu.cpp;  
  120.   
  121. import java.io.*;  
  122. import java.net.*;  
  123. import java.awt.event.ActionEvent;  
  124. import java.awt.event.ActionListener;  
  125. import java.awt.event.KeyAdapter;  
  126. import java.awt.event.KeyEvent;  
  127. import javax.swing.*;  
  128.   
  129. public class Client extends JFrame implements Runnable {  
  130.  private Socket client;  
  131.  private OutputStream output;  
  132.  private InputStream input;  
  133.  private Thread outThread;  
  134.  private JTextArea display;  
  135.  private JTextField text1;  
  136.  private JButton startButton;  
  137.  private JMenu loginMenu = new JMenu("登录");   
  138.  private JMenuItem register = new JMenuItem("注册");  
  139.  private JMenuItem login = new JMenuItem("登录");  
  140.  private JMenuBar bar = new JMenuBar();  
  141.  private Register registerDlg ;  
  142.  private Login loginDlg;  
  143.  private RandomAccessFile file;  
  144.   
  145.  public static void main(String args[]) {  
  146.   Client c = new Client();  
  147.   c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  148.  }  
  149.   
  150.  public Client() {  
  151.   super("Client");  
  152.   startButton = new JButton("Connect to server");  
  153.   text1 = new JTextField(20);  
  154.   display = new JTextArea(730);  
  155.   display.setEditable(false);  
  156.    loginMenu.add(register);  
  157.   loginMenu.add(login);  
  158.   bar.add(loginMenu);  
  159.   setJMenuBar(bar);  
  160.   Container container = getContentPane();  
  161.   container.setLayout(new BorderLayout());  
  162.   container.add(startButton,BorderLayout.NORTH);  
  163.   container.add(new JScrollPane(display),BorderLayout.CENTER);  
  164.   container.add(text1,BorderLayout.SOUTH);  
  165.   
  166.   try {  
  167.      file = new RandomAccessFile(new File("E://login.txt"),"rw");  
  168.   } catch (IOException e1) {  
  169.    e1.printStackTrace();  
  170.   }  
  171.   registerDlg = new Register(this,file);  
  172.   loginDlg = new Login(this,file);  
  173.   startButton.addActionListener(new ActionListener(){  
  174.    public void actionPerformed(ActionEvent e) {  
  175.     display.setText("连接服务器");  
  176.     startButton.setEnabled(false);  
  177.     try {  
  178.      client = new Socket("127.0.0.1"5000);  
  179.      output = client.getOutputStream();  
  180.      input = client.getInputStream();  
  181.      outThread = new Thread(Client.this);  
  182.      outThread.start();  
  183.     } catch (IOException ee) {  
  184.     }  
  185.    }  
  186.   });  
  187.   text1.addKeyListener(new KeyAdapter(){  
  188.    public void keyPressed(KeyEvent ke) {  
  189.    if(ke.getKeyCode() == KeyEvent.VK_ENTER){  
  190.     byte writeBytes[] = new byte[50];  
  191.     String s = loginDlg.getLoginName()+": " + text1.getText() + "";  
  192.     text1.setText("");  
  193.     writeBytes = s.getBytes();  
  194.     display.append(s+" ");  
  195.     try {  
  196.      output.write(writeBytes);  
  197.     } catch (IOException ee) {  
  198.     }  
  199.     if (s.trim().equals(loginDlg.getLoginName()+": exit")) {  
  200.      outThread.stop();  
  201.      quit();  
  202.     }  
  203.    }  
  204.    }  
  205.   });  
  206.   register.addActionListener(new ActionListener(){  
  207.    public void actionPerformed(ActionEvent e) {  
  208.     registerDlg.setVisible(true);  
  209.    }  
  210.   });  
  211.   login.addActionListener(new ActionListener(){  
  212.    public void actionPerformed(ActionEvent e) {  
  213.     loginDlg.setVisible(true);  
  214.    }  
  215.   });  
  216.   setSize(300400);  
  217.   setResizable(false);  
  218.   setVisible(true);  
  219.  }  
  220.   
  221.  public void run() {  
  222.   while (true) {  
  223.    byte readBytes[] = new byte[1024];  
  224.    try {  
  225.     input.read(readBytes);  
  226.    } catch (IOException e) {  
  227.    }  
  228.    String s = new String(readBytes);  
  229.    display.append(s+" ");  
  230.    if (s.trim().equals("Server: exit"))  
  231.     break;  
  232.   }  
  233.   quit();  
  234.  }  
  235.   
  236.  public void quit() {  
  237.   try {  
  238.    output.close();  
  239.    input.close();  
  240.    client.close();  
  241.   } catch (IOException e) {  
  242.   }  
  243.   startButton.setEnabled(true);  
  244.  }  
  245. }  
  246.   
  247. package edu.jlu.cpp;  
  248.   
  249. import java.awt.*;  
  250. import java.awt.event.*;  
  251. import java.io.*;  
  252. import javax.swing.*;  
  253.   
  254.   
  255. public class Login extends JDialog{  
  256.  private JTextField textField;  
  257.  private JButton loginButton;  
  258.  private RandomAccessFile file;//保存注册信息的文件  
  259.  private String loginName = "guest";//保存登录者的名字,为登陆为guest;  
  260.    
  261.  public Login(JFrame f,RandomAccessFile file){  
  262.   super(f,"登陆",false);  
  263.   this.file = file;  
  264.   JPanel panel = new JPanel();  
  265.   panel.add(new JLabel("昵称:"));  
  266.   textField = new JTextField(10);  
  267.   panel.add(textField);  
  268.   Container container = getContentPane();  
  269.   container.setLayout(new BorderLayout());  
  270.   container.add(panel,BorderLayout.NORTH);  
  271.   loginButton = new JButton("登陆");  
  272.   container.add(loginButton,BorderLayout.SOUTH);  
  273.   setVisible(false);  
  274.   setBounds(100,200,200,200);  
  275.   loginButton.addActionListener(new LoginListener());  
  276.  }  
  277.    
  278.  public String getLoginName(){  
  279.   return loginName;  
  280.  }  
  281.  /**//* 
  282.   * 登录监听器,当单击登陆按钮时,触发该事件 
  283.   * 从文件中读取并查找是否注册过,如果没有找 
  284.   * 到则弹出未注册警告。否则弹出欢迎对话框表 
  285.   * 示欢迎 
  286.   */  
  287.  private class LoginListener implements ActionListener{  
  288.  public void actionPerformed(ActionEvent e) {  
  289.   boolean flag = false;  
  290.   try {  
  291.    String name = textField.getText().trim();  
  292.    textField.setText("");  
  293.    file.seek(0);  
  294.    while(file.getFilePointer() < file.length()){  
  295.     String nik = file.readUTF();  
  296.     if(nik.equals(name)){  
  297.      flag = true;  
  298.      loginName = name;  
  299.      break;  
  300.     }  
  301.    }  
  302.    if(!flag){  
  303.     String warning="没有找到你的账号请先注册!";  
  304.              JOptionPane.showMessageDialog(Login.this,warning,"警告",JOptionPane.WARNING_MESSAGE);  
  305.    }else{  
  306.     String welcome="欢迎来聊天!";  
  307.              JOptionPane.showMessageDialog(Login.this,welcome,"欢迎",JOptionPane.WARNING_MESSAGE);  
  308.    }  
  309.    Login.this.setVisible(false);  
  310.   } catch (IOException e1) {  
  311.    e1.printStackTrace();  
  312.   }  
  313.  }  
  314.  }  
  315. }  
  316.   
  317. package edu.jlu.cpp;  
  318.   
  319. import java.awt.*;  
  320. import java.awt.event.*;  
  321. import java.io.*;  
  322. import javax.swing.*;  
  323.   
  324.   
  325. public class Register extends JDialog{  
  326.  private String nickName;  
  327.  private JTextField textField;  
  328.  private JButton registerButton;  
  329.  private RandomAccessFile file;////保存注册信息的文件  
  330.    
  331.  public Register(JFrame f,RandomAccessFile file){  
  332.   super(f,"注册",false);  
  333.   this.file = file;  
  334.   JPanel panel = new JPanel();  
  335.   panel.add(new JLabel("昵称:"));  
  336.   textField = new JTextField(10);  
  337.   panel.add(textField);  
  338.   Container container = getContentPane();  
  339.   container.setLayout(new BorderLayout());  
  340.   container.add(panel,BorderLayout.NORTH);  
  341.   registerButton = new JButton("注册");  
  342.   container.add(registerButton,BorderLayout.SOUTH);  
  343.   setVisible(false);  
  344.   setBounds(100,200,200,200);  
  345.   registerButton.addActionListener(new RegisterListener());  
  346.  }  
  347.  /**//* 
  348.   * 注册监听器,当单击登注册按钮时,触发该事件 
  349.   * 并向文件中写入注册信息。 
  350.   */  
  351.  private class RegisterListener implements ActionListener{  
  352.  public void actionPerformed(ActionEvent e) {  
  353.   try {  
  354.    file.seek(file.length());  
  355.    String  str = textField.getText();  
  356.    textField.setText("");  
  357.    file.writeUTF(str);  
  358.    Register.this.setVisible(false);  
  359.   } catch (IOException e1) {  
  360.    e1.printStackTrace();  
  361.   }  
  362.  }  
  363.  }