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

📄 chatserver.java

📁 java课程设计包含汉诺塔
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.*;


public class chatServer extends JFrame 
{ //以下为图形界面变量
  JPanel contentPane;
  JMenuBar jMenuBar1 = new JMenuBar();
  JMenu jMenuFile = new JMenu();
  JMenuItem jMenuFileExit = new JMenuItem();
  JMenu jMenuHelp = new JMenu();
  JMenuItem jMenuHelpAbout = new JMenuItem();
  JLabel statusBar = new JLabel();
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel jPanel1 = new JPanel();
  BorderLayout borderLayout2 = new BorderLayout();
  JLabel jLabel1 = new JLabel();
  static java.awt.List jList1 = new java.awt.List(13);
  JScrollPane scrollpane=new JScrollPane(jList1);
  
  //---------------------
  JPanel broadpanel = new JPanel();
  JLabel blab = new JLabel();
  JTextField btxt=new JTextField(30);
  JButton bbut=new JButton();
      
  //以下为网络相关变量
  static Vector clients=new Vector(10);   //用vector向量数组存储连接客户变量
  static ServerSocket server=null;        //建立服务器socket
  static int active_connects=0;           //用来存储目前连接的客户数
  static Socket socket=null;               //用来存储一个套接字连接
  
  //chatServer main method
   public static void main(String[] args) 
   {
     try
     { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     }
     catch(Exception e) 
     { e.printStackTrace();
     }
     chatServer chatServer1=new chatServer();      //实例化一个chatServer类
	 chatServer1.show();
	 System.out.println("Server starting ...");
     try
	 { server=new ServerSocket(2525);      //使用端口2525初始化服务器套接字
	 }
	 catch(IOException e)
	 { System.out.println("Error:"+e);
	 }
	 while(true)
	 { if(clients.size()<5)       //当客户数小于5个时开始连接
		{ try
		  { socket=server.accept();   //用来存储连接上的客户socket
			if(socket!=null)
			{ System.out.println(socket+"连接");    //在控制台打印客户连接信息
			}
		  }
		  catch(IOException e)
		  {  System.out.println("Error:"+e);
		  }
		  int i=0;
		  do
		  {  Client c=new Client(socket);      //定义并实例化一个Client线程类,一个就对应一个客户连接
			 clients.addElement(c);             //加入clients数组中
			 if(checkName(c))                  //调用checkName方法验证c的合法性
			 { int connum=++chatServer1.active_connects;  //定义connum来存储活动连接数
			   String constr="目前有"+connum+"客户相连";    //在状态栏里显示连接数
			   chatServer1.statusBar.setText(constr);
			   Client listdata=(Client)clients.elementAt(i);   //将连接客户的socket信息存储进listdata数组
			   chatServer1.jList1.addItem(listdata.ip+"连接",i);  //将客户socket信息写入list框
			   c.start();                                        //启动线程
			   notifyconnect(c.name);
			   try{ Thread.sleep(2000);
				  }
			   catch(Exception e){}                                        //启动线程
			   notifyRoom();                                    //用notifyRoom方法来监视聊天室连接变化
			          //不断改变clients数组并刷新客户端信息
			 }
			 else
			 {   //如果名字不合法
			   c.ps.println("TAKEN");
			   disconnect(c);
			 }
			 i++;
			 break;
		  }
		  while(i<clients.size());
	   }
	   else                                   //如果clients数组超过了5个
	   { try{Thread.sleep(200);}
		 catch(InterruptedException e){}
	   }
	 }//end of while
  }// end of main method

  /**Construct the frame*/
  public chatServer()                          //chatServer类的构造器用来初始化一些UI信息
  { enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try 
    { jbInit();
    }
    catch(Exception e) 
    { e.printStackTrace();
    }
  }
  /**Component initialization*/
  private void jbInit() throws Exception  
  { contentPane=(JPanel) this.getContentPane();
    contentPane.setLayout(borderLayout1);
    this.setSize(new Dimension(400,300));
    this.setTitle("简易聊天服务器端");
    statusBar.setText("目前的连接数为:");
    
    jMenuFile.setText("File");
    jMenuFileExit.setText("Exit");
    jMenuFileExit.addActionListener
    (new ActionListener()
      { public void actionPerformed(ActionEvent e) 
        {jMenuFileExit_actionPerformed(e);
        }
      });
    jMenuHelp.setText("Help");
    jMenuHelpAbout.setText("About");
    jMenuHelpAbout.addActionListener
    (new ActionListener()
     {  public void actionPerformed(ActionEvent e) 
        {jMenuHelpAbout_actionPerformed(e);
        }
     });
    //system message
    broadpanel.setLayout(new FlowLayout());
    blab.setText(" 系统广播 ");
    btxt.setText(" 请输入系统广播内容 ");
    bbut.setLabel("发送");
    broadpanel.add(blab);
    broadpanel.add(btxt);
    broadpanel.add(bbut);
    bbut.addActionListener
    (new ActionListener() 
     { public void actionPerformed(ActionEvent e) 
       { broadbut_actionPerformed(e);
       }
    });
    
    jPanel1.setLayout(borderLayout2);
    jLabel1.setText("服务器端连接客户");
    jMenuFile.add(jMenuFileExit);
    jMenuHelp.add(jMenuHelpAbout);
    jMenuBar1.add(jMenuFile);
    jMenuBar1.add(jMenuHelp);
    this.setJMenuBar(jMenuBar1);
    contentPane.add(statusBar,BorderLayout.SOUTH);
    contentPane.add(jPanel1,BorderLayout.CENTER);
    jPanel1.add(jLabel1,BorderLayout.NORTH);
    jPanel1.add(scrollpane,BorderLayout.CENTER);
    jPanel1.add(broadpanel,BorderLayout.SOUTH);

  }//end of jbinit
  
  //send system message 
  public void broadbut_actionPerformed(ActionEvent e)
  { //sendClients("SYSMSG"); 
   	if(clients.size()>0)
   	{ StringBuffer sysmsg=new StringBuffer("SYSMSG");
	  sysmsg.append(":"+btxt.getText());	 
	  sendClients(sysmsg);     
	  btxt.setText(""); 
	}
	else
	{ JOptionPane.showMessageDialog(null,"no user","Server ",JOptionPane.ERROR_MESSAGE); 	
	}
  }
  
  /**File | Exit action performed*/
  public void jMenuFileExit_actionPerformed(ActionEvent e)   //实现退出菜单方法
  { sendClients(new StringBuffer("QUIT"));                   //向客户端发送断开连接信息
	closeAll();                                               //调用closeAll方法关闭所有连接
	System.exit(0);
  }
  
  /**Help | About action performed*/
  public void jMenuHelpAbout_actionPerformed(ActionEvent e)  //实现about对话框,意义不大,可以去掉
  { chatServer_AboutBox dlg=new chatServer_AboutBox(this);
    Dimension dlgSize=dlg.getPreferredSize();
    Dimension frmSize=getSize();
    Point loc=getLocation();
    dlg.setLocation((frmSize.width-dlgSize.width)/2+loc.x,(frmSize.height-dlgSize.height)/2+loc.y);
    dlg.setModal(true);
    dlg.show();
  }                                
  
  /**Overridden so we can exit when window is closed*/
  protected void processWindowEvent(WindowEvent e)          //实现关闭服务器程序要进行的操作
  { super.processWindowEvent(e);
    if (e.getID()==WindowEvent.WINDOW_CLOSING)
    { jMenuFileExit_actionPerformed(null);
    }
  }

  /*以下实现各种方法*/
  public static void notifyRoom()                          //用来监视连接信息,不断刷新clients数组并刷新客户端用户列表信息
  {  StringBuffer people=new StringBuffer("PEOPLE");
	 for(int i=0;i<clients.size();i++)
	 { Client c=(Client)clients.elementAt(i);
	   people.append(":"+c.name);
	 }
	 sendClients(people);                                 //用sendClients方法向客户端发送信息

⌨️ 快捷键说明

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