最新分享 » 编程设计 » 【转】用java写的基于Socket的简单即时通讯程序

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

时间:2008-8-1 作者:天空下的雨 分类: 编程设计 评论:0 浏览:6700

用java写的基于Socket的简单即时通讯程序,用户可以注册并登录,也可以作为游客身份使用.
 

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