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

📄 chatserver.java

📁 关于客户端与服务端间的聊天室
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	            return sRet;
	        }
	        catch(Exception e) 
	        {
	            return str;
	        }
       } 

  public static synchronized void sendClients(StringBuffer msg)   //实现sendClients方法专用来向每个连接的客户端发送信息
  {
//解析字符串

           String  sSender = "";
           String sMsg = "";
           String sHeader = "";
           String sReceiver = "";


           String info = msg.toString();
           StringTokenizer stinfo=new StringTokenizer(info,":");  //用StringTokenizer类来读取用":"分段字符
		   sHeader=stinfo.nextToken();                        //head用来存储类似于关键字的头信息
           if(stinfo.hasMoreTokens())
		   sSender=stinfo.nextToken();                               //关键字后的第二段数据是发送者
		   if(stinfo.hasMoreTokens())
		   sMsg =stinfo.nextToken();                                //关键字后的第三段数据是正文
		   if(stinfo.hasMoreTokens())
		   sReceiver=stinfo.nextToken(); 
		   if (sHeader.equals("MSG"))
		   {                 //关键字后的第四段数据是要发送的客户名
			String msg1=sHeader+":"+sSender+":"+sMsg;
//			msg1 = getGB(msg1);
			msg=new StringBuffer(msg1);
			System.out.println("258hang");
			System.out.println(msg);
		   }
    	 for(int i=0;i<clients.size();i++)
		 {
		     Client c=(Client)clients.elementAt(i);
		     String sName = c.name;//得到名字
		     System.out.println("sHeader:"+sHeader+"***"); //发现这个header全部是INFO,即在点击‘发送’按钮之后,并没有去执行new Client
             //sHeader = msg.toString().substring(0,3);
             if (sHeader.equals("MSG")) 
             {//如果是发消息
                 System.out.println("sName:"+sName+"***");
                 System.out.println("c.name:"+c.name+"***");
                 if (sReceiver.equals("all"))
                 {//如果是所有人,则除了自己全部发送。
                     if (!sName.equals(sSender))
                     {
                       c.send(msg);
                     }

                 } else  if (sName.equals(sReceiver))
                 {//如果接收者名称对应则发送
    			     c.send(msg);
    			 }
    		 }
    		 else
    		 {
    		     c.send(msg);
    		 }
		  }
  }
         

  public static void closeAll()                             //实现关闭所有连接信息
  {
     while(clients.size()>0)                                 //遍历clients数组删除所有连接客户信息
	 {
	     Client c=(Client)clients.firstElement();
		 try
		 {
		     c.socket.close();
		 }
		 catch(IOException e)
		 {
		     System.out.println("Error:"+e);
		 }
		 finally
		 {
		     clients.removeElement(c);
		 }
	 }//end of while
  }//end of closeAll method

  public static boolean checkName(Client newclient)         //实现检查连接客户的socket信息是否合法
  {
     for(int i=0;i<clients.size();i++)
	 {
	     Client c=(Client)clients.elementAt(i);
		 if((c!=newclient)&&c.equals(newclient.name))
			 return false;
	 }
	 return(true);
  }//end of checkName method

  public static synchronized void disconnect(Client c)         //实现断开单个客户的方法
  {
     try
	 {
		 jList1.addItem(c.ip+"断开连接");                      //在服务器端程序的list框中显示断开信息

		 chatServer.active_connects--;                       //将连接数减1
	     c.send(new StringBuffer("QUIT"));                    //向客户发送断开连接信息
		 c.socket.close();

	 }
	 catch(IOException e)
	 {
	     System.out.println("Error:"+e);
	 }
	 finally
	 {
	     clients.removeElement(c);                          //从clients数组中删除此客户的相关socket等信息
	 }
  }


}
class Client extends Thread                              //实现 Client线程类
{
    Socket socket;                                       //用来存储一个连接客户的socket信息
    String header;  //sss added
	String name;                                         //用来存储客户的连接姓名
	String ip;                                           //用来存储客户的ip信息
 	DataInputStream dis;                                 //用来实现接受从客户端发来的数据流
	PrintStream ps;                                      //用来实现向客户端发送信息的打印流

	public void send(StringBuffer msg)                   //实现想客户端发送信息的方法
	{
	   System.out.println("sss要发送了。。msg:"+msg);
	   ps.println(msg);                                  //用打印流发送信息
	   ps.flush();
	}
	public static synchronized String getGB(String str)
        {
	        if (str==null) return null;
	        try {
	            byte[] bytes = str.getBytes("ISO8859-1");
	            String sRet = new String(bytes, "GBK");
	            return sRet;
	        }
	        catch(Exception e) 
	        {
	            return str;
	        }
       } 

	public  Client(Socket s)                             //Client线程类的构造器
	{
	   socket=s;
	   try
	   {
	       dis=new DataInputStream(s.getInputStream());  //存储特定客户socket的输入流接受s这个客户发送到服务器端的信息
		   ps=new PrintStream(s.getOutputStream());      //存储特定客户socket的输出流发送服务器给s这个客户的信息
		   String info=dis.readLine();                   //读取接受来的信息
		   info=getGB(info);
		   StringTokenizer stinfo=new StringTokenizer(info,":");  //用StringTokenizer类来读取用":"分段字符
		   header=stinfo.nextToken();                        //head用来存储类似于关键字的头信息
           System.out.println("header is:"+header);
           if(stinfo.hasMoreTokens())
		   name=stinfo.nextToken();                               //关键字后的第二段数据是客户名信息
		   if(stinfo.hasMoreTokens())
		   ip=stinfo.nextToken();                                //关键字后的第三段数据是客户ip信息
		   if(stinfo.hasMoreTokens())
		   chatServer.send=stinfo.nextToken();                   //关键字后的第四段数据是要发送的客户名

		   System.out.println("313行执行");
		   System.out.println(header);                               //在控制台打印头信息
	   }
	   catch(IOException e)
	   {
	       System.out.println("Error:"+e);
	   }
	}//end of Client constrator

	public void run()                                           //线程运行方法
	{
	   while(true)
	   {
	       String line=null;
		   try
		   {
		       line=dis.readLine();   
		       line=getGB(line);                         //读取客户端发来的数据流

		   }
		   catch(IOException e)
		   {
		       System.out.println("Error"+e);
			   chatServer.disconnect(this);
			   chatServer.notifyRoom();
			   return;
		   }

		   if(line==null)    //客户已离开
		   {
			   chatServer.disconnect(this);
			   chatServer.notifyRoom();
			   return;
		}
 		   System.out.println(line);
		   StringTokenizer st=new StringTokenizer(line,":");
		   String keyword=st.nextToken();
          //这里接收客户端发送的消息。msg
		   if(keyword.equals("MSG"))                          //如果关键字是MSG则是客户端发来的聊天信息
			  {
			  	
				       StringBuffer msg=new StringBuffer("MSG:");     //在服务器端再重新建立一个字符缓冲
				       msg.append(name);     
                       msg.append(st.nextToken("\0"));
//                       System.out.println("402hang run");
					   chatServer.sendClients(msg);                   //再将某个客户发来的聊天信息发送到每个连接客户的聊天栏中
		               
		       }
		   else if(keyword.equals("QUIT"))                   //如果关键字是QUIT则是客户端发来断开连接的信息
			  {

		       chatServer.disconnect(this);                  //服务器断开与这个客户的连接
			   chatServer.notifyRoom();                      //继续监听聊天室并刷新其他客户的聊天人名list
			   this.stop();
		   }
	   }
	}
  }  //end of class Client

⌨️ 快捷键说明

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