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

📄 serverframe.java

📁 简易聊天工具
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	public ClientEchoThread(Socket s) 
	{						                                  // ClientEchoThread线程类的构造器
		socket = s;
		try 
		{
		  	ps = new PrintWriter(
					new BufferedWriter(
						new OutputStreamWriter(s.getOutputStream())));	// 存储客户socket输入流,接收发送的信息
		  	dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));		// 存储客户socket输出流,向客户发送信息
		  	String info = dis.readLine();					// 读取接收的信息
		  	StringTokenizer stinfo = new StringTokenizer(info, ":");	// 用读取“:”分段字符
		  	String head = stinfo.nextToken();				// 存储关键字的头信息
		  	if(stinfo.hasMoreTokens())
		    	name = stinfo.nextToken();				// 关键字后的第二段数据是客户名信息
		  	if(stinfo.hasMoreTokens())
		    	IP = stinfo.nextToken();					// 关键字后的第三段数据是客户IP信息
		  	System.out.println(IP);					// 在服务器控制台打印头信息
	     }
	     catch(IOException e) 
	     {
	       	System.out.println("Error:" + e);
	     }
	}		                                            // end of ClientEchoThread constrator
	public void run()
	{							                         // 定义线程run()方法
		while(true) 
		{
	       	String line = null;
		  	try 
		  	{
		    	line = dis.readLine();					// 读客户端发送的数据流
		  	}
		  	catch(IOException e) 
		  	{
				System.out.println("Error" + e);
				ServerFrame.sendClients("SYSTEM:" + this.name + "离开聊天室!");
				ServerFrame.disconnect(this);
				ServerFrame.notifyRoom();
				return;
		  	}
		  	if(line == null) 
		  	{						                     // 客户已离开
			    ServerFrame.sendClients("SYSTEM:" + this.name + "离开聊天室!");		
				ServerFrame.disconnect(this);
				ServerFrame.notifyRoom();
				return;
		  	}
		  	System.out.println(line);
		  	StringTokenizer st = new StringTokenizer(line, ":");
		  	String keyword = st.nextToken();
		  	if(keyword.equals("QUIT")) 
		  	{	
		  		String s = "SYSTEM:" + this.name + "离开聊天室!";			                            // 关键字是QUIT则是客户端发来断开连接的信息
				ServerFrame.sendClients(s);		
				ServerFrame.disconnect(this);			
				ServerFrame.notifyRoom();				// 继续监听聊天室并刷新其他客户聊天人名列表
				return;
			}
		  	else if(keyword.equals("MSG"))
		  	{
		  		StringTokenizer stt = new StringTokenizer(st.nextToken(), "|");
		  		keyword = stt.nextToken();
		  		//System.out.println(keyword);
		  		if(keyword.equals("public"))
		  		{
		  			ServerFrame.sendClients(line);	
		  		}
		  		else 
		  		{
		  			String sendToName = stt.nextToken();
		  			//System.out.println(sendToName);
		  			if(sendToName != null) 
		  			{
		  				ServerFrame.findFromName(sendToName).send(line);
		  				this.send(line);
		  			}
		  		}	
		  	}
		  	else if(keyword.equals("NETMEETING_CONNECT_REQUEST"))
		  	{
		  		StringTokenizer peoplest = new StringTokenizer(st.nextToken(), "|");
		  		int tokensCount = peoplest.countTokens();
		  		String[] meetingPeople = new String[tokensCount]; 
		    	for(int i = 0; i < tokensCount; i++)
		    	{
		    		meetingPeople[i] = peoplest.nextToken();
		    	}
		    	NetMeetingCheck nmc = new NetMeetingCheck(this, meetingPeople, this.name);
		    	nmc.start();	
		  	}
		  	else if(keyword.equals("NETMEETING_CONNECT_REVERT"))
		  	{
		  		this.netMeetingFlag = st.nextToken();
		  		//this.netMeetingFlag.notifyAll();	
		  	}
		  	else
		  	{
		  		try
		  		{
		  			ServerFrame.findFromName(st.nextToken()).send(line);		
		  		}catch(NullPointerException e)
		  		{
		  			System.out.println("没有聊天对象!");
		  			JOptionPane.showMessageDialog(null,"没有聊天对象!");	
		  		}
		  	}
		}
	}
}		                                              // end of class ClientEchoThread
class NetMeetingCheck extends Thread       //处理NetMeeting请求                 
{
	String[] names = null;
	ClientEchoThread parent = null;
	String applicant;
	public NetMeetingCheck(ClientEchoThread p, String[] ns, String applicant)	
	{
		names = ns;	
		parent = p;
		this.applicant = applicant;
	}
	public void run()
	{
		for(int i = 0; i < names.length; i++)
		{
			ClientEchoThread c = ServerFrame.findFromName(names[i]);
			if(c != parent) c.send("NETMEETING_CONNECT:" + applicant);	
		}
		try
		{
			/*
			for(int i = 0; i < names.length; i++)
			{
				ClientEchoThread c = ServerFrame.findFromName(names[i]);
				synchronized (c.netMeetingFlag) 
				{ 
					//while(c.netMeetingFlag == null)
					//{
						System.out.println("*******************");
						c.netMeetingFlag.wait();               //等待对方应答
					//}
				}
			}
			*/
			this.sleep(8000);								//最大等待时间 8秒
		}catch (InterruptedException e) {} 
		System.out.println("/////////////////////////////////");
		String s = "NETMEETING_START:" + parent.name + "|";
		for(int i = 0; i < names.length; i++)
		{
			ClientEchoThread c = ServerFrame.findFromName(names[i]);
			if(c.netMeetingFlag.equals("accept")) s += c.name + "|";	
		}
		for(int i = 0; i < names.length; i++)
		{
			ClientEchoThread c = ServerFrame.findFromName(names[i]);
			if(c.netMeetingFlag.equals("accept")) c.send(s);
			c.netMeetingFlag = "refuse";	
		}
		this.suspend();		
	}
}
class chatServer_AboutBox extends JDialog implements ActionListener {

  JPanel panel1 = new JPanel();
  JPanel panel2 = new JPanel();
  JPanel insetsPanel1 = new JPanel();
  JPanel insetsPanel2 = new JPanel();
  JPanel insetsPanel3 = new JPanel();
  JButton button1 = new JButton();
  JLabel imageLabel = new JLabel();
  JLabel label1 = new JLabel();
  JLabel label2 = new JLabel();
  JLabel label3 = new JLabel();
  JLabel label4 = new JLabel();
  BorderLayout borderLayout1 = new BorderLayout();
  BorderLayout borderLayout2 = new BorderLayout();
  FlowLayout flowLayout1 = new FlowLayout();
  GridLayout gridLayout1 = new GridLayout();
  String product = "聊天服务器端";
  String version = "1.0";
  String copyright = "Copyright (c) 2004";
  String comments = "聊天室服务器端实现多线程客户连接和显示连接信息";
  public chatServer_AboutBox(Frame parent) {
    super(parent);
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    pack();
  }
  /**Component initialization*/
  private void jbInit() throws Exception  {
    //imageLabel.setIcon(new ImageIcon(Frame1_AboutBox.class.getResource("[Your Image]")));
    this.setTitle("About");
    setResizable(false);
    panel1.setLayout(borderLayout1);
    panel2.setLayout(borderLayout2);
    insetsPanel1.setLayout(flowLayout1);
    insetsPanel2.setLayout(flowLayout1);
    insetsPanel2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    gridLayout1.setRows(4);
    gridLayout1.setColumns(1);
    label1.setText(product);
    label2.setText(version);
    label3.setText(copyright);
    label4.setText(comments);
    insetsPanel3.setLayout(gridLayout1);
    insetsPanel3.setBorder(BorderFactory.createEmptyBorder(10, 60, 10, 10));
    button1.setText("Ok");
    button1.addActionListener(this);
    insetsPanel2.add(imageLabel, null);
    panel2.add(insetsPanel2, BorderLayout.WEST);
    this.getContentPane().add(panel1, null);
    insetsPanel3.add(label1, null);
    insetsPanel3.add(label2, null);
    insetsPanel3.add(label3, null);
    insetsPanel3.add(label4, null);
    panel2.add(insetsPanel3, BorderLayout.CENTER);
    insetsPanel1.add(button1, null);
    panel1.add(insetsPanel1, BorderLayout.SOUTH);
    panel1.add(panel2, BorderLayout.NORTH);
  }
  /**Overridden so we can exit when window is closed*/
  protected void processWindowEvent(WindowEvent e) {
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      cancel();
    }
    super.processWindowEvent(e);
  }
  /**Close the dialog*/
  void cancel() {
    dispose();
  }
  /**Close the dialog on a button event*/
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == button1) {
      cancel();
    }
  }
}

⌨️ 快捷键说明

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