rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » Java基础

Java Socket编写的一个多人聊天室程序(下)

/************************************************/

//用户端

/************************************************/

package clientPackage;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridLayout;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;

import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JList;
import javax.swing.JRadioButton;
import java.awt.Dimension;
import javax.swing.JSplitPane;

public class ClientDemo extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JPanel jPanel = null;

private JLabel jLabel = null;

private JLabel jLabel1 = null;

private JTextField userName = null;

private JButton link = null;

private JScrollPane jScrollPane = null;

private JTextArea talk = null;

private JPanel jPanel1 = null;

private JList list = null;

private JPanel jPanel2 = null;

private JLabel jLabel2 = null;

private JRadioButton all = null;

private JRadioButton one = null;

private JPanel jPanel3 = null;

private JTextField userNumber = null;

private JButton exit = null;

private JButton send = null;

private JTextField jTextField1 = null; protected Socket socket = null; // @jve:decl-index=0: private DefaultListModel data=new DefaultListModel(); private final int PORT=6886;
private final String HOSTNAME="127.0.0.1"; private int count=0; private String name=null;
private String ip=null;
private BufferedReader reader=null; // @jve:decl-index=0:
private PrintWriter writer=null; // @jve:decl-index=0:
private receiveThread clientGO=null;//接收消息的线程

private JScrollPane jScrollPane1 = null;

private JSplitPane jSplitPane = null; /**
* This method initializes jPanel * @return javax.swing.JPanel private JPanel getJPanel() {
   if (jPanel == null) {
    jLabel1 = new JLabel();
    jLabel1.setText("连接用户名");
    jLabel = new JLabel();
    jLabel.setText("在线用户");
    GridLayout gridLayout = new GridLayout();
    gridLayout.setRows(1);
    jPanel = new JPanel();
    jPanel.setLayout(gridLayout);
    jPanel.add(jLabel, null);
    jPanel.add(jLabel1, null);
    jPanel.add(getUserName(), null);
    jPanel.add(getLink(), null);    return jPanel;
}

/**
* This method initializes userName * @return javax.swing.JTextField private JTextField getUserName() {
   if (userName == null) {
    userName = new JTextField();    return userName;
}

/**
* This method initializes link * @return javax.swing.JButton private JButton getLink() {
   if (link == null) {
    link = new JButton();
    link.setText("链接");
    link.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(java.awt.event.ActionEvent e) {
      connect(PORT);//连接服务器
      link.setEnabled(false);     });    return link;
}

/**
* This method initializes jScrollPane * @return javax.swing.JScrollPane private JScrollPane getJScrollPane() {
   if (jScrollPane == null) {
    jScrollPane = new JScrollPane();
    jScrollPane.setViewportView(getTalk());    return jScrollPane;
}

/**
* This method initializes talk * @return javax.swing.JTextArea private JTextArea getTalk() {
   if (talk == null) {
    talk = new JTextArea();
    talk.setEditable(false);    return talk;
}

/**
* This method initializes jPanel1 * @return javax.swing.JPanel private JPanel getJPanel1() {
   if (jPanel1 == null) {
    jPanel1 = new JPanel();
    jPanel1.setLayout(new BorderLayout());
    jPanel1.add(getJPanel2(), BorderLayout.SOUTH);
    jPanel1.add(getJScrollPane1(), BorderLayout.CENTER);    return jPanel1;
}

/**
* This method initializes list * @return javax.swing.JList
*/ private JList getList() {
   if (list == null) {
    list = new JList(data);
    list.setSize(new Dimension(100, 140));    return list;
}

/**
* This method initializes jPanel2 * @return javax.swing.JPanel private JPanel getJPanel2() {
   if (jPanel2 == null) {
    jLabel2 = new JLabel();
    jLabel2.setText("选择消息发送方式:");
    GridLayout gridLayout1 = new GridLayout();
    gridLayout1.setRows(3);
    jPanel2 = new JPanel();
    jPanel2.setLayout(gridLayout1);
    jPanel2.add(jLabel2, null);
    jPanel2.add(getAll(), null);
    jPanel2.add(getOne(), null);    return jPanel2;
}

/**
* This method initializes all * @return javax.swing.JRadioButton private JRadioButton getAll() {
   if (all == null) {
    all = new JRadioButton();
    all.setText("群发");
    all.setSelected(true);
    all.setVisible(true);
    all.setEnabled(false);    return all;
}

/**
* This method initializes one * @return javax.swing.JRadioButton private JRadioButton getOne() {
   if (one == null) {
    one = new JRadioButton();
    one.setText("单人发送");
    one.setEnabled(false);    return one;
}

/**
* This method initializes jPanel3 * @return javax.swing.JPanel private JPanel getJPanel3() {
   if (jPanel3 == null) {
    jPanel3 = new JPanel();
    jPanel3.setLayout(new BorderLayout());
    jPanel3.add(getUserNumber(), BorderLayout.SOUTH);
    jPanel3.add(getExit(), BorderLayout.WEST);
    jPanel3.add(getSend(), BorderLayout.EAST);
    jPanel3.add(getJTextField1(), BorderLayout.CENTER);    return jPanel3;
}

/**
* This method initializes userNumber * @return javax.swing.JTextField private JTextField getUserNumber() {
   if (userNumber == null) {
    userNumber = new JTextField();
    userNumber.setEditable(false);
    userNumber.setText("目前在线人数:0");    return userNumber;
}

/**
* This method initializes exit * @return javax.swing.JButton private JButton getExit() {
   if (exit == null) {
    exit = new JButton();
    exit.setText("断开链接");
    exit.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(java.awt.event.ActionEvent e) {
      disconnect();//断开链接
      link.setEnabled(true);     });    return exit;
}

/**
* This method initializes send * @return javax.swing.JButton private JButton getSend() {
   if (send == null) {
    send = new JButton();
    send.setText("发送");
    send.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(java.awt.event.ActionEvent e) {
      sendMessage("());     });    return send;
}

* This method initializes jTextField1 * @return javax.swing.JTextField private JTextField getJTextField1() {
   if (jTextField1 == null) {
    jTextField1 = new JTextField();
    jTextField1.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(java.awt.event.ActionEvent e) {
      sendMessage("());     });    return jTextField1;
}

/**
* This method initializes jScrollPane1 * @return javax.swing.JScrollPane private JScrollPane getJScrollPane1() {
   if (jScrollPane1 == null) {
    jScrollPane1 = new JScrollPane();
    jScrollPane1.setViewportView(getList());    return jScrollPane1;
}

/**
* This method initializes jSplitPane * @return javax.swing.JSplitPane private JSplitPane getJSplitPane() {
   if (jSplitPane == null) {
    jSplitPane = new JSplitPane();
    jSplitPane.setOneTouchExpandable(true);
    jSplitPane.setContinuousLayout(true);
    jSplitPane.setDividerLocation(190);
    jSplitPane.setRightComponent(getJScrollPane());
    jSplitPane.setLeftComponent(getJPanel1());    return jSplitPane;
}

/**
* @param args public static void main(String[] args) {
   new ClientDemo();
}

/**
* This is the default constructor
*/ public ClientDemo() {
   super();
   initialize();
   setVisible(true);
}

/**
* This method initializes this * @return void private void initialize() {
   this.setSize(595, 343);
   this.setContentPane(getJContentPane());
   this.setTitle("客户机");
   this.addWindowListener(new java.awt.event.WindowAdapter() {
    public void windowClosing(java.awt.event.WindowEvent e) {
     if(socket!=null){//还没有断开链接
       disconnect();
         dispose();
         System.exit(0);      }    ButtonGroup b=new ButtonGroup();
   b.add(all);b.add(one);
}

/**
* This method initializes jContentPane * @return javax.swing.JPanel private JPanel getJContentPane() {
   if (jContentPane == null) {
    jContentPane = new JPanel();
    jContentPane.setLayout(new BorderLayout());
    jContentPane.add(getJPanel(), BorderLayout.NORTH);
    jContentPane.add(getJPanel3(), BorderLayout.SOUTH);
    jContentPane.add(getJSplitPane(), BorderLayout.CENTER);    return jContentPane; /******************************************************************************/ /******************************************************************************/ public void connect(int port){
   try {
    socket=new Socket(HOSTNAME,port);
    reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    writer=new PrintWriter(socket.getOutputStream());     String line="";
    line=reader.readLine();
    talk.append(line+"\n");     //发送用户信息给服务器
    name=userName.getText();
    ip=socket.getLocalAddress().toString();
    writer.println(name+"@"+ip);
    writer.flush();
    userName.setEditable(false);
   } catch (UnknownHostException e) {
    // TODO 自动生成 catch 块
    talk.append("错误:找不到服务器"+e.toString()+"\n");
    link.setEnabled(true);
   } catch (IOException e) {
    // TODO 自动生成 catch 块
    talk.append("错误:连接失败"+e.toString()+"\n");
    link.setEnabled(true);    clientGO=new receiveThread(reader);//启动获取服务器信息的线程
   clientGO.start(); //断开链接
public void disconnect(){
   if(socket==null){
    JOptionPane.showMessageDialog(this, "还没有建立连接,不能断开。", "Error", JOptionPane.ERROR_MESSAGE);
    return ;    userName.setEditable(true);
   data.removeAllElements();//删除所有列表信息
   count=0;
   userNumber.setText("目前在线人数:"+count);
   try{
    sendMessage("QUIT");
    clientGO.go=false;//停止读取来自服务器消息的线程
    clientGO.stop();
    socket.close();
    socket=null;
    talk.append("成功断开链接!\n");
    userNumber.setText("目前在线人数:"+count);
   }catch(IOException e){e.printStackTrace();talk.append("错误:关闭链接出错 "+e.toString()+"\n");} //发送消息
public void sendMessage(String msg){
   if(socket==null||writer==null){
    JOptionPane.showMessageDialog(this, "连接已断开", "Error", JOptionPane.ERROR_MESSAGE);
    return ;    try{
   writer.println(msg);
   writer.flush();
   jTextField1.setText(null);
   }catch(Exception e){e.printStackTrace();talk.append("发送消息失败:"+e.toString());} //接受消息的线程
class receiveThread extends Thread {
   BufferedReader reader=null;
   Boolean go=true;
   public receiveThread(BufferedReader reader){
    this.reader=reader;    public void run(){
    String line=null;
    String sort=null;     try{
     while(go){
      line=reader.readLine();
      sort=null;
      StringTokenizer st=new StringTokenizer(line,"@");
      if(st.hasMoreTokens())
      sort=st.nextToken();//类型
      if(line==null)
       go=false;
      if(sort.equalsIgnoreCase("EXIT")){//服务器关闭{
       go=false;
       line="SERVER:服务器关闭!";
       writer.close();
       reader.close();
       socket.close();
       socket=null;
       talk.append("由于服务器关闭,自动断开链接!\n");
       link.setEnabled(true);
       data.removeAllElements();
       count=0;
       userNumber.setText("目前在线人数:"+count);       else if(sort.equalsIgnoreCase("MSG")){
       line=st.nextToken();       else if(sort.equalsIgnoreCase("FULL")){
       line="SERVER:服务器缓冲区已满!请稍后尝试链接!";
       writer.close();
       reader.close();
       socket.close();
       socket=null;
       go=false;//结束线程       else if(sort.equalsIgnoreCase("PEOPLE")){//更新列表
       data.removeAllElements();
       while(st.hasMoreTokens()){
        data.addElement(st.nextToken());        count=data.getSize();
       userNumber.setText("目前在线人数:"+count);
       line="\t\t\t在线列表已更新!";       else line="辨别类型失败!";
      talk.append(line+"\n");     }catch(IOException ioe){ioe.printStackTrace();talk.append(ioe.toString()+"\n");} }
} // @jve:decl-index=0:visual-constraint="25,0"

顶一下
(0)
踩一下
(0)