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

📄 clients.java

📁 JAVA
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	{	JTextField field;                                            
	    JButton button;                                              
		ChangeName(String str,int x,int y)
		{
			JLabel input=new JLabel("请输入名字:");
			field=new JTextField(6);
			button=new JButton("确定");
			button.addActionListener(this);
			JPanel jp=new JPanel();
			jp.add(input);
			jp.add(field);
			add(jp,BorderLayout.CENTER);
			JPanel panel=new JPanel();
			panel.add(button);
			add(panel,BorderLayout.SOUTH);
			setBounds(x,y,200,100);
			setVisible(true);
		}
		public void actionPerformed(ActionEvent e)
		{
		      if(e.getSource()==button)
		      {
		    	  clientname=field.getText().trim();
		    	  me.setName(clientname);
		    	  setVisible(false);
		      }
		}	
	}
	/**
	 * 这个内部类是用来实现用户的群聊功能
	 * 建立了两个线程,一个是用来发信息给服务程序的
	 * 线程,一个是用来接收服务程序发来的广播信息并
	 * 显示给用户
	 * 
	 */
	public class GroupChat implements Runnable
	{
		MulticastSocket socket=null;
		InetAddress address=null;
		ChatFrameTest frame=null;
		byte[] by=new byte[800];
		String str;
		Thread t=null;
		SendMessage sendmessage=null;
		boolean stop=false;
		Date d=null;
		
		GroupChat()
		{
			frame=new ChatFrameTest("123",Color.pink);
			d=new Date();
			try
			{
				socket=new  MulticastSocket(8866);
				address=InetAddress.getByName("239.253.253.2");//这些是广播通信的程序,IP是自定义的
				socket.joinGroup(address);//加入广播组
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		    sendmessage=new SendMessage();//启动发送信息的线程
			t=new Thread(this);
			t.start();
		}
		public void run()
		{
			while(!stop)
			{	
			   DatagramPacket packet=new DatagramPacket(by,by.length,address,8866);
			   try 
		       {
				 System.out.println("berfordfjdfjasaaaaaaa");
				 socket.receive(packet);//这个上一个用来接收服务器发来的信息
				 System.out.println("skdfksdfksdflsdflsdfjlsdflsldfjlsdjfksdfkdkfjlasdjk");
				 str=new String(packet.getData(),0,packet.getLength());
				 StringTokenizer st=new StringTokenizer(str,"^");
				 String s=st.nextToken();
				 if("ADD".equals(s))//如果S为ADD则说明有新的用户上线了,所以要在界面上显示,并把其个人信息保存到列表中
				 {
					 String str=st.nextToken();
					 StringTokenizer stt=new StringTokenizer(str,",");
                     int num=Integer.parseInt(stt.nextToken());
                     if(!isExist(num))
                     {
                    	 Friends f=new Friends(str,false);
    					 list.add(f);
    					 mainpanel.addClient(f);
    					 mainpanel.setSize(w, ++h);
    					 System.out.println("add friends:"+f.acountip);
                     }
				 }
				 else if("REMOVE".equals(s))//如果S为REMOVE则表示有用户下线了,也要在界面上显示他,并将其从列表中删除
				 {
					 mainpanel.removeCliends(st.nextToken());
					 mainpanel.setSize(w, --h);
					 System.out.println("remove a friend");
				 }
				 else if("CHAT".equals(s))//如果S为CHAT则说明是一般的群聊,显示其内容就行了
				 {
					 frame.showMessage(st.nextToken());
				 } 
				 
				 else if("SINGLECHAT".equals(s))//如果S为SINGLECHAT则说明有用户想请求单
				 {
					 StringTokenizer sstt=new StringTokenizer(st.nextToken(),",");
					 String ss=sstt.nextToken();
					 if(name.equals(ss))//如果ss和用户的用户名相同则说明是服务程序发给自己的,所以才会做处理,否则什么都不做.
					 {
						 String clientname=sstt.nextToken();//取得请求方的用户名
						 chatSign(clientname);//在界面上显示出来 
					 }
				 }
			   }
			   catch (IOException e) 
			   {
				 e.printStackTrace();
			   }
			}
		}
		
		/**
		 * 这个方法用来停止循环,关闭socket
		 *
		 */
		public void stop()
		{
			stop=true;
			if(sendmessage.socket!=null)
			{
				sendmessage.socket.close();
				socket=null;
			}
			sendmessage=null;
			t=null;
			if(socket!=null)
			{
				socket.close();
				socket=null;
			}
		}
		
		/**
		 * 这个是专门用来发送用户的信息的线程类,就是接收到一个用户发来的信息,经过处理后
		 * 再将信息群发
		 * @author 黄祖光
		 */
		private class SendMessage 
		{                                      
		 	  DatagramSocket socket=null;
		 	  InetAddress address=null;
		 	  int port=6688;
		 	  byte[] by=new byte[800];

		 	  SendMessage()
		 	  {
		 		  try
		 		  {
		 			socket=new DatagramSocket();  
		 			address=InetAddress.getByName(serverport);
		 		  }
		 		  catch(Exception e)
		 		  {
		 			  e.printStackTrace();
		 		  }
		 		}
		 	  
		 	  /**
		 	   * 用来发送群聊的内容
		 	   * @param s
		 	   */
		 	  private void sendMessage(String s)
		 	  {
		 		 try
	 			  {
	 				  if(!"".equals(s))
	 				  {
	 				      by=("CHAT#"+(d.getYear()+1900)+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+
	 				    		  ":"+(d.getMinutes()+1)+":"+(d.getSeconds()+1)+"\n"+name+" :"+s).getBytes();
	 				      DatagramPacket packet=new DatagramPacket(by,by.length,address,port);
	 				      socket.send(packet);
	 				  }
	 				  else 
	 				  {
	 					  frame.tshow.append("发送内容不能为空!!\n");
	 				  }
	 			  }
	 			  catch(Exception e)
	 			  {
	 				  System.out.println(e);
	 			  }
		 	  }
		 	  
		 	  /**
		 	   * 这个方法是用专门发送用户单聊请求信息的
		 	   * @param s
		 	   */
		 	  private void sendClientInf(String s)
		 	  {
		 		  try
		 		  {   byte[] b=("SINGLECHAT#"+s+","+name).getBytes();
		 			  DatagramPacket packet =new DatagramPacket(b,b.length,address,port);
		 			  socket.send(packet);
		 		  }
		 		  catch(Exception e)
		 		  {
		 			  e.printStackTrace();
		 		  }
		 	  }
		}
	
	/**
	 * 这个是个群聊界面的类,用来提供群聊的界面
	 * @author 55
	 *
	 */
	private class ChatFrameTest extends JFrame implements ActionListener//这个聊天窗口是专门用来群聊的,用这类是为了与单独聊天区分开来
	{
	   JTextArea tshow,twrite;
	   JButton send,close;
	   JPanel tp,bp;
	   String str,received,name;
	   Dimension dim;
	   int port;
	   boolean closed=false;
	  
	   
	   public ChatFrameTest(String name,Color color)
	   {
		   this.name=name;
		   setTitle("群聊");
	   	   setSize(530,300);
	   	   tshow=new JTextArea(9,45);
	   	   tshow.setFont(new Font("SansSerif",Font.BOLD,12));
	   	   tshow.setEditable(false);
	   	   JScrollPane scrollpane=new JScrollPane(tshow);
	   	   twrite=new JTextArea(3,45);
	   	   twrite.setFont(new java.awt.Font("SansSerif", Font.BOLD, 12));
	   	   twrite.setEnabled(true);
	   	   twrite.setLineWrap(true);
	   	   JScrollPane wjsp=new JScrollPane(twrite);
	   	   tp=new JPanel();
	   	   tp.setBackground(color);
	   	   //tp.setBackground(Color.orange);
	   	   tp.add(scrollpane,BorderLayout.NORTH);
	   	   tp.add(wjsp,BorderLayout.SOUTH);
	   	   add(tp,BorderLayout.CENTER);
	   	   send=new JButton("发送");
	   	   send.addActionListener(this);
	   	   close=new JButton("关闭");
	   	   close.addActionListener(this);
	   	   bp=new JPanel();
	   	   bp.setBackground(color);
	   	   bp.add(send);
	   	   bp.add(close);
	   	   add(bp,BorderLayout.SOUTH);
	   	   Toolkit kit=Toolkit.getDefaultToolkit();
	   	   dim=kit.getScreenSize();
	   	   setLocation((dim.width-500)/2,(dim.height-300)/2 );
	   	   
		   twrite.addKeyListener(new KeyAdapter()
		   {
			   public void keyPressed(KeyEvent ke)
			   {
				   if(ke.getKeyCode()==KeyEvent.VK_ENTER&&ke.isControlDown())//当按Ctrl+Enter时就将消息发送出去
				   {
					   str=twrite.getText();
					   sendmessage.sendMessage(str);
					   str=null;
					   twrite.setText("");
				   }
			   } 
		   });
		   
		   addWindowListener(new WindowAdapter()
		   {
			   public void windowClosing(WindowEvent we)
			   {
				 new WarmDialog("谢谢使用","哈哈..").setVisible(true);
			   }
		   });
	   }
	   
	   /**
	    * 用来监听按钮事件,发送消息和关闭对话框
	    */
	   public void actionPerformed(ActionEvent ae)
	   {
		   if(ae.getSource()==send)
		   {
			    str=twrite.getText();
			    sendmessage.sendMessage(str);
			    str=null;
			    twrite.setText("");
		   }
		   else if(ae.getSource()==close)
		   {
			   System.out.println("groudchat is closed..");
			   setVisible(false);
		   }
	   }
	   public String getString()
	   {
		   return str;
	   }
	   
	   /**
	    * 显示聊天内容
	    * @param str
	    */
	   public void showMessage(String str)
	   {
		  tshow.append(str+"\n");   
	   }
	}
  }
	public static void main(String[] args) 
	{
      new Clients().setResizable(true);
	}
}

⌨️ 快捷键说明

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