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

📄 kbrll.java

📁 此程序是用JAVA JDK语言编写的
💻 JAVA
字号:
/*   2004年毕业设计
                  聊天室客户端程序 kbrll.java
                                       
                                          设计人:王楠

*/


//加载必要的类
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
//定义主类
public class kbrll 
{
 //创建类变量
 static jform1 form1=new jform1();
 static jform2 form2=new jform2();
 static kbrll kbr1=new kbrll();             //创建本类实体
 static String llname;                      //llname为本地昵称
 static String s_ip;                        //server的ip地址
 static int s_port;                         //server的端口
 static String rece;                        //接收广播信息
 static boolean biao=true;                  //循环标识
 static Vector ll=new Vector(10,10);        //其它人昵称集合
 static Socket s;                           //主套接字
 static String mjian="~'`";                 //信息间隔符
 static boolean qiao=false;                 //悄悄话标识 



//类方法,程序起点
public static void main(String kerberos[])
{
 

 form1.button1.addActionListener(new aclis1());//设form1.button1的聆听者
 form1.load();	
 while(biao){}//等待form1的连接成功
 System.out.println("ok");
 form2.addWindowListener(new aclis2());
 form2.button1.addActionListener(new aclis1());//设form2.button1的聆听者
 form2.list1.addItemListener(new aclis1());    //设form2.list1的聆听者
 form2.checkbox1.addItemListener(new aclis2());//设form2.checkbox1的聆听者
 
 //反复侦听广播
 try{
     MulticastSocket msock=new MulticastSocket(1129);       //创建广播接收类
     InetAddress llip=InetAddress.getByName("224.0.1.129"); //创建广播地址    
     msock.joinGroup(llip);                                 //加入多播地址
     //侦听广播
     while(true)
          {
           byte[] buf=new byte[512];	
           DatagramPacket mpack=new DatagramPacket(buf,buf.length);
  	       msock.receive(mpack);            
           rece=new String(mpack.getData());//将数据包转换成字符串
           System.out.println(rece);
           kbr1.message(rece);              //分析处理字符串
           
          }//end while
    }catch(IOException e){}      
}//end main


//连接信息通信方法
 static void sock1(String sname,int sport,String llname)
{
	try{
        
        Socket sp=new Socket(sname,sport);     
	    //定义输出流
	    PrintStream out=new PrintStream(sp.getOutputStream());
    	//定义输入流
    	BufferedReader in
    	=new BufferedReader(new InputStreamReader(sp.getInputStream()));
	    
	    out.println("liao");             //向服务器发送标识信息
	    String ltsname;                  //聊室名称
	    String sin=in.readLine();        //读取服务器返回信息
	    
	    if(sin.equals("yes"))            //判断是否为聊天服务器
	        {
	      	 out.println(llname);        //向服务器发送本机聊天昵称
	      	 sin=in.readLine();          //接收服务器返回信息
             if(sin.equals("max")){
             	                   form1.label1.setText("聊天室人已满");
             	                   form1.load();
             	                  }
             if(sin.equals("more"))      //重名
                                   {form1.label1.setText("此昵称已存在,换之");
	   	                            //关闭流和连接
	   	                            //sp.close();
	   	                           // in.close();
	   	                          //  out.close();
	   	                            form1.load();
             	                   }//if

             if(sin.equals("ok"))             //可以加入
                {
                 form1.label2.setText("正在下载信息..........");           	                  
	   	         ltsname=in.readLine();       //读取聊天室名称 
	   	         sin=in.readLine();           //读取用户集合的长度
	   	         int x=Integer.parseInt(sin); //转换
	   	         form2.load(); 
	   	         if(x>0)	   	           
	   	            for(int i=0;i<x;i++)
	   	               {
	   	                sin=in.readLine();       //读取用户
	   	                ll.add(sin);	         //加入本地	   	             	
	   	                form2.list1.add(sin);
	   	                }//for
	   	          form2.setTitle("Kerberos's connect  "+ltsname);
	   	          form2.label2.setText("聊天室共有"+(x+1)+"人");                   
             	  s_ip=sname;                 //将server的ip赋给s_ip
             	  s_port=sport;               //将server的端口赋给s_port
             	  form1.dispose();            //关闭form1
             	      //打开form2           
             	  biao=false;
             	 }//if
                     
	      	}//if
         //如果不是聊天服务器,退出程序
	     else                    
	        {
	        System.out.println("所连接非聊天服务器");
	       	form1.dispose();
			System.exit(0);	
	        }//else 	
	        sp.close();
	   	    in.close();
	   	    out.close();
	   
	   }catch(IOException e){
	   	                     form1.label1.setText("服务器或端口有误");
	   	                     form1.load();
	   	                    }
	
  }//end sock
 
  //聊天信息通信方法
  static void sock2(String ip,int po,String fo)
  {
   try{
   	   Socket sp=new Socket(ip,po);     
	   //定义输出流
	   PrintStream out=new PrintStream(sp.getOutputStream());
       //定义输入流
       BufferedReader in
       =new BufferedReader(new InputStreamReader(sp.getInputStream()));
   	  
   	   int len=fo.length();
   	   
   	   System.out.println(fo);
   	   out.println("mess");             //发送聊天请求
   	   out.println(len);                //发送信息长度
   	   for(int i=0;i<len;i++)
   	   out.println(fo.substring(i,i+1));//发送信息         
   	  }catch(Exception e){}
 	
  }
 
 //退出聊天室通信方法
 static void sock3(String ip,int po,String fo)
  {
   try{
   	   Socket sp=new Socket(ip,po);     
	   //定义输出流
	   PrintStream out=new PrintStream(sp.getOutputStream());
       //定义输入流
       BufferedReader in
       =new BufferedReader(new InputStreamReader(sp.getInputStream()));
   	   out.println(fo);
   	  }catch(Exception e){}
 	
  }
 
 
  
 //字符串分析方法
 void message(String srece)
 {
 if(srece.startsWith("@"))
   {
   int dfip=srece.indexOf("@",1);
   String snip=srece.substring(2,dfip);     //取出IP地址
   if(s_ip.equals(snip))                    //判断是否为服务器地址
      { srece=srece.substring(dfip+1);
        String str=srece.substring(0,3);    //取标识字符串 
        
        //添加用户
        if(str.equals("+++"))               
          {
           int df=srece.indexOf("+++",3);
           String sn=srece.substring(3,df);	//取出用户名
           if(!sn.equals(llname))
              form2.list1.add(sn);
              ll.add(sn);	
              form2.label2.setText("聊天室共有"+(ll.size()+1)+"人");
           }//end if
         
         //删除用户
         if(str.equals("---"))
            {
             int df=srece.indexOf("---",3);
             String sn=srece.substring(3,df);//取出用户名	
             if(!sn.equals(llname))
               {
                form2.list1.remove(sn);
                ll.removeElement(sn);
                form2.label2.setText("聊天室共有"+(ll.size()+1)+"人");	
                }
              else{//如果用户名为自己,则是被服务器踢出
     	           form2.rtext1.append("因为您的不良言行惹怒了管理员,所以您将被踢出聊天室。"); 
     	           
     	           form2.rtext1.append("\n请倒数十秒,然后向管理员的方向忏悔。");
     	           form2.rtext1.append("\n"); 
     	          //倒数十秒后退出
     	          try{
     	              for(int i=9;i>(-1);i--)
     	                 {
     	                  form2.rtext1.append(""+i+" "); 
     	                  Thread.sleep(1000);
     	                 }
     	                 form2.dispose();
	                     System.exit(0);
     	          }catch(Exception e){}
     	           }   	
              }//end if   	

          //添加聊天信息
          if(str.equals(mjian))
            {   	         
   	         int df1=srece.indexOf(mjian,3);
   	         String sn1=srece.substring(3,df1);   //取出信息读取权艰        	 
        	 String sn2=srece.substring(df1+3);   //取出聊天信息	         
             System.out.println(sn1);
             System.out.println(sn2);
    
             if(sn1.equals("所有人")||sn1.equals(llname))//可读
               {
       	        int rtexth=form2.rtext1.getRows();      	        
       	        form2.rtext1.append(sn2);  
       	        form2.rtext1.append("\n");    	
       	       }//end if        	
        	}//end if
      }//end if
   }//end if
 }//end message



 
 //内部类,用于事件聆听
 static class aclis1 implements ActionListener,ItemListener
{ 
 //按钮事件
  public void actionPerformed(ActionEvent e)
  {
   String dx=e.getActionCommand();
   //form1.button1
   if(dx.equals("连接"))  
	 {
	  String sname;
   	  int sport;
  	  form1.button1.setVisible(false);
      form1.text1.setEditable(false);
      form1.text2.setEditable(false);
      form1.text6.setEditable(false);
      form1.label2.setVisible(true);
      try{
          sname=form1.text1.getText();                   //取得待连接地址
          llname=form1.text6.getText();                  //取得聊天昵称
	      sport=Integer.parseInt(form1.text2.getText()); //取得端口号
          kbr1.sock1(sname,sport,llname);                //调用连接方法
 
         }catch(Exception d){form1.label1.setText("端口输入类型有误");
                             form1.load();                                    
                             } 
      }
   //form2.button1
   else if(dx.equals("发送"))  
      {
       String toname,info,m,inmess;
       toname=form2.text1.getText();	       
       m=form2.rtext2.getText();
       if(!m.equals(""))
          { 
          	info=llname+" 对 "
                +toname+"\b说:"
                +m;           
            if(qiao==true)
               {
               inmess=mjian+toname+mjian+"悄悄话>> "+info;
               if(!toname.equals("所有人"))
                  form2.rtext1.append("\n悄悄话>> "+info);
               }
            else
               inmess=mjian+"所有人"+mjian+info;     //格式化聊天信息 
            System.out.println(inmess);
           form2.rtext2.setText("");
           kbr1.sock2(s_ip,s_port,inmess);           //向服务器发送聊天信息
       }   }                                                



       
  }//end actionPerformed
 
 //列表框事件
 public void itemStateChanged(ItemEvent e)
  {
   form2.text1.setText(form2.list1.getSelectedItem());
 	
  }//end itemStateChanged   
   
 }//end class aclis
 

 //复选框事件和退出事件
 static class aclis2 extends WindowAdapter implements ItemListener
{ 
 public void itemStateChanged(ItemEvent e)
  {
   qiao=!qiao;
   System.out.println(qiao);
  }//end itemStateChanged  
 public void windowClosing(WindowEvent e)
  {
   //向服务器发送退出信息
   kbrll.sock3(kbrll.s_ip,kbrll.s_port,"---"+kbrll.llname+"---");
   form2.dispose();
   System.exit(0);	
  } 
 }  
  		
}//end class kbrll

⌨️ 快捷键说明

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