⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframe.java

📁 采用Java语言进行网络编程实现
💻 JAVA
字号:
package mulitservernew;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import java.net.*;import java.io.*;import java.util.Vector;  //引入Vector类,用于存储客户信息import java.util.StringTokenizer;  //引入StringTokenizer类,用于信息分离/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: </p> * @author not attributable * @version 1.0 */public class MainFrame extends JFrame {  ServerSocket server=null;  ConnectSocket connect=null;  static Vector clients=new Vector();   //用vector向量存储客户列表信息  JPanel contentPane;  JLabel jLabel1 = new JLabel();  JTextField jTextField1 = new JTextField();  JButton jButton1 = new JButton();  TitledBorder titledBorder1;  TitledBorder titledBorder2;  TitledBorder titledBorder3;  TitledBorder titledBorder4;  TitledBorder titledBorder5;  TitledBorder titledBorder6;  JPanel jPanel1 = new JPanel();  Border border1;  TitledBorder titledBorder7;  BorderLayout borderLayout1 = new BorderLayout();  JScrollPane jScrollPane1 = new JScrollPane();  JTextArea jTextArea1 = new JTextArea();  JPanel jPanel2 = new JPanel();  JScrollPane jScrollPane2 = new JScrollPane();  BorderLayout borderLayout2 = new BorderLayout();  JTextArea jTextArea2 = new JTextArea();  //Construct the frame  public MainFrame() {    enableEvents(AWTEvent.WINDOW_EVENT_MASK);    try {      jbInit();    }    catch(Exception e) {      e.printStackTrace();    }  }  //Component initialization  private void jbInit() throws Exception  {    contentPane = (JPanel) this.getContentPane();    titledBorder1 = new TitledBorder("");    titledBorder2 = new TitledBorder("");    titledBorder3 = new TitledBorder("");    titledBorder4 = new TitledBorder("");    titledBorder5 = new TitledBorder("");    titledBorder6 = new TitledBorder("");    border1 = BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.white,Color.white,new Color(103, 101, 98),new Color(148, 145, 140));    titledBorder7 = new TitledBorder(new EtchedBorder(EtchedBorder.RAISED,Color.white,new Color(148, 145, 140)),"系统信息");    jLabel1.setFont(new java.awt.Font("Dialog", 0, 14));    jLabel1.setText("监听端口");    jLabel1.setBounds(new Rectangle(26, 13, 60, 25));    contentPane.setLayout(null);    this.setSize(new Dimension(376, 365));    this.setTitle("多客户信息广播系统-服务器端");    jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));    jTextField1.setText("6544");    jTextField1.setBounds(new Rectangle(123, 13, 92, 25));    jButton1.setBounds(new Rectangle(242, 13, 105, 25));    jButton1.setFont(new java.awt.Font("Dialog", 0, 14));    jButton1.setText("开始监听");    jButton1.addActionListener(new MainFrame_jButton1_actionAdapter(this));    jPanel1.setBorder(titledBorder7);    jPanel1.setBounds(new Rectangle(15, 54, 330, 145));    jPanel1.setLayout(borderLayout1);    jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);    jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);    jTextArea1.setText("");    jPanel2.setLayout(borderLayout2);    jPanel2.setBorder(titledBorder7);    jPanel2.setBounds(new Rectangle(17, 203, 327, 121));    jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);    jScrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);    contentPane.add(jLabel1, null);    contentPane.add(jButton1, null);    contentPane.add(jTextField1, null);    contentPane.add(jPanel1, null);    jPanel1.add(jScrollPane1,  BorderLayout.CENTER);    contentPane.add(jPanel2, null);    jPanel2.add(jScrollPane2, BorderLayout.CENTER);    jScrollPane2.getViewport().add(jTextArea2, null);    jScrollPane1.getViewport().add(jTextArea1, null);  }  //Overridden so we can exit when window is closed  protected void processWindowEvent(WindowEvent e) {    super.processWindowEvent(e);    if (e.getID() == WindowEvent.WINDOW_CLOSING) {      System.exit(0);    }  }  class ConnectSocket extends Thread{        Socket socket;        public void run(){            while(true){                       try{                           socket=server.accept();//等待客户连接                      }  catch(IOException e2){                           jTextArea1.append(" 客户连接失败\n");                       }                     /*客户连接成功,定义并实例化一个Client线程,每一个线程对应一个客户连接*/                  Client c=new Client(socket);                  /*将连接的客户添加到客户列表存储clients中*/                clients.addElement(c);                /*测该用户名称是否存在,如不存在,则启动线程,实现客户与服务器的信息交互通道*/                 if(checkName(c)){                         //启动线程                        c.start();                                /*向每个客户端更新客户列表信息*/                     notifyRoom();                     }else{                        disconnect(c);                     }                }        }}      class Client extends Thread{                 String name;         //用来存储客户的连接姓名                 BufferedReader dis;  //用于实现接受从客户端发送来的数据流                 PrintStream ps;     //用来实现向客户端发送信息的打印流                 Socket socket;  //用于建立套接字                 public  Client(Socket s){       //Client 线程的构造器                         socket=s;  //将服务器-客户端建立连接所形成的套接字传递到该线程                    try{                          /*储特定客户socket的输入流,接受客户发送到服务器端的信息*/                         dis=new BufferedReader(new InputStreamReader(socket.getInputStream()));                          /*存储特定客户的输出流,发送服务器信息给客户*/                          ps=new PrintStream(socket.getOutputStream());                          /*读取接收到的信息,该信息为客户登陆信息*/                          String info=dis.readLine();                          //*将信息用":"分离                          StringTokenizer stinfo=new StringTokenizer(info,":");                   /*用head存储关键区分字*/                           String head=stinfo.nextToken();                   /*第二个数据段是客户的名称*/                           name=stinfo.nextToken();                                jTextArea1.append("系统消息:"+name+"已经连接\n");                       }catch(IOException e){                      jTextArea2.append("系统消息:用户连接出错\n");                    }                  }                  /*实现向客户端发送信息的方法*/                  public void send(String msg){                      ps.println(msg);                      ps.flush();                    }              /*读取客户端发送过来的信息*/              public void run(){                     while(true){                              String line=null;                                try{                                  /*读取客户端发送的信息*/      line=dis.readLine();                                }catch(IOException e){                                              /*如果出错,则要关闭连接,并更新客户列表信息*/                                  jTextArea2.append("系统消息:读客户信息出错");                                  disconnect(this);      notifyRoom();                                  return ;                                  }                                      /*对读入的信息进行分离,以确定信息类型*/                                StringTokenizer st=new StringTokenizer(line,":");                                String keyword=st.nextToken();//关键字,判断消息类型                                      /*如果关键字是MSG,则是客户端发送的聊天信息*/                               if(keyword.equalsIgnoreCase("MSG")){                                       /*将接收到的客户聊天信息,通过调用信息广播成员方法,      发送到所有客户端*/                                    sendClients(line);                                      /*如果关键字是QUIT,则是客户端发送的退出信息*/                          } else if(keyword.equalsIgnoreCase("QUIT")){                                  /*发送同意断开信息到客户端*/      send("QUIT");      /*关闭连接,并更新客户列表信息*/                                  disconnect(this);                                  notifyRoom();                                  /*结束当前线程*/                                  this.stop();                                }                      }                  }      }      public  boolean  checkName(Client newClient){           for(int i=0;i<clients.size();i++){                /*取出每一个连接对象元素*/                   Client c=(Client)clients.elementAt(i);                /*如果不是对象自身但名字相同,则表明出现了重复名称*/                   if((c!=newClient)&&(c.name).equals(newClient.name))                      return false;    }    return true;}  public void  notifyRoom(){             /*服务器发送到客户的信息字符串,“PEOPLE”表示是客户列表信息*/  String people="PEOPLE";             for(int i=0;i<clients.size();i++){                   /*获取每一个服务器—客户交互信息线程*/                  Client c=(Client)clients.elementAt(i);                  /*将用户名称添加到发送信息字符串*/              people+=":"+c.name;             }          /*调用信息广播成员方法,将用户列表信息发送到所有客户端*/             sendClients(people);  }  public void sendClients(String msg){          for(int i=0;i<clients.size();i++){                  /*获取每一个服务器—客户交互信息线程*/                  Client c=(Client)clients.elementAt(i);                  /*通过线程的发送方法将信息发送出去*/                  c.send(msg);          }  }  public void disconnect(Client c){             try{               jTextArea1.append(c.name+"断开连接\n");          /*向客户发送断开信息*/                    c.send("QUIT");               clients.removeElement(c);               c.socket.close();//断开连接             }catch(IOException e) {              jTextArea2.append("客户断开错误\n");             }  }  void jButton1_actionPerformed(ActionEvent e) {    try {//打开服务器端口            server = new ServerSocket(Integer.parseInt(jTextField1.getText()));      						jTextArea2.append("系统提示:聊天服务器系统开始启动...... \n");    } catch (IOException e1) {   //捕捉可能产生的异常             jTextArea2.append("服务器端口打开出错\n");    }    if (server != null) {                /*开始用户连接*/            ConnectSocket connect=new ConnectSocket();            connect.start();         }  }}class MainFrame_jButton1_actionAdapter implements java.awt.event.ActionListener {  MainFrame adaptee;  MainFrame_jButton1_actionAdapter(MainFrame adaptee) {    this.adaptee = adaptee;  }  public void actionPerformed(ActionEvent e) {    adaptee.jButton1_actionPerformed(e);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -