📄 mainframe.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 + -