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

📄 chatapplet.java

📁 Java J2EE 的聊天室客户端和服务器端的程序
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import java.io.*;
import java.util.*;

public class chatApplet extends Applet {
  /*以下用于定义UI变量*/
  Panel panel1 = new Panel();//用于放置输入姓名和连接两个按钮
  BorderLayout borderLayout1 = new BorderLayout();
  Panel panel2 = new Panel();//用于放置聊天信息显示和聊天人员列表
  Panel panel3 = new Panel();//用于放置发送信息区域
  FlowLayout flowLayout1 = new FlowLayout();
  FlowLayout flowLayout2 = new FlowLayout();
  Label label1 = new Label();
  TextField name_txt = new TextField(15);
  Button button1 = new Button();
  Button button2 = new Button();
  TextArea chat_txt = new TextArea(15,30);
  Label label2 = new Label();
  Button button3 = new Button();
  TextField msg_txt = new TextField(20);
  java.awt.List list1 = new java.awt.List(13);
  /*以下定义数据流和网络变量*/
  Socket soc=null;//定义连接套接字
  PrintStream ps=null;//定义打印流 
  Listen listen=null; //定义一个客户端线程
  //初始化图形界面
  public void init()                 
	{
     resize(475,350);  
     this.setLayout(borderLayout1);
    panel2.setLayout(flowLayout1);
    panel3.setLayout(flowLayout2);
    label1.setText("姓名:");  
    button1.setLabel("连接");
    button2.setLabel("断开连接");
    chat_txt.setEditable(false);
    panel2.setBackground(Color.cyan);
    panel1.setBackground(Color.gray);
    label2.setText("聊天信息:");
    button3.setLabel("发送");
    msg_txt.setText("请输入聊天信息");
    panel3.setBackground(Color.gray);
    this.add(panel1, BorderLayout.NORTH);
    panel1.add(label1, null);
    panel1.add(name_txt, null);
    panel1.add(button1, null);
    panel1.add(button2, null);
    this.add(panel2, BorderLayout.CENTER);
    panel2.add(chat_txt, null);
    panel2.add(list1, null);
    this.add(panel3,  BorderLayout.SOUTH);
    panel3.add(label2, null);
    panel3.add(msg_txt, null);
    panel3.add(button3, null);
  }
  //事件触发代码
  public boolean action(Event evt,Object obj)    
	{
      if(evt.target instanceof Button)
		{
	     String label=(String) obj;
		 if(label.equals("连接"))//如果点击连接后
			{
		     if(soc==null)
			 	{
			     try
					{
					//使用端口2525实例化一个本地套接字	
					 soc=new Socket(InetAddress.getLocalHost(),2525);     
					 //在控制台打印实例化的结果
					 System.out.println(soc);                             
					 //将ps指向soc的输出流
					 ps=new PrintStream(soc.getOutputStream());           
					 //定义一个字符缓冲存储发送信息
					 StringBuffer info=new StringBuffer("INFO: ");        
					 //其中INFO为关键字让服务器识别为连接信息
					 //并将name和ip用":"分开,在服务器端将用一个
					 //StringTokenizer类来读取数据
					 String userinfo=name_txt.getText()+":"+InetAddress.getLocalHost().toString();
					 ps.println(info.append(userinfo));				
					 ps.flush();
					 //将客户端线程实例化
					 listen=new Listen(this,name_txt.getText(),soc);      
					 listen.start();//启动线程
				 }
				 catch(IOException e)
					{
				     System.out.println("Error:"+e);
					 disconnect();
				 }
			 }
		 }
	   else if(label.equals("断开连接"))
			{
		//如果点击断开连接按钮则运行disconnect()		
	         disconnect();
	   }
	   //如果点击发送按钮
	   else if(label.equals("发送"))
			{
	         if(soc!=null)
				{
			     //定义并实例化一个字符缓冲存储发送的聊天信息		
			     StringBuffer msg=new StringBuffer("MSG: "); 
			         //其中MSG为关键词
				 try
				 {
				        String msgtxt=new String(msg_txt.getText());
				 }
				 catch(Exception e){}				 
				 //用打印流发送聊天信息
				 ps.println(msg.append(msg_txt.getText()));          
				 ps.flush();
			 }
	   }
	  }
     return true;
  } 
  //客户端点击断开连接要运行的方法
  public void disconnect()                                         
	{
     if(soc!=null)
		{
	     try
			{
		        listen.suspend();
		        //用打印流发送QUIT信息通知服务器断开此次通信
			ps.println("QUIT");
			ps.flush();
			soc.close();//关闭套接字
		 }
		 catch(IOException e)
			{
		     System.out.println("Error:"+e);
		 }
		 finally
			{			 
		 }
	 }
  }
 //客户端线程类用来监听服务器传来的信息
  class Listen extends Thread       
{
 //用来存储客户端连接后的name信息	
 String name=null;
 //用来实现客户端接受服务器数据的输入流
 DataInputStream dis=null;          
 //用来实现从客户端发送数据到服务器的打印流
 PrintStream ps=null;               
 //用来存储客户端的socket信息
 Socket socket=null;                
 //用来存储当前运行的chatApplet实例
 chatApplet parent=null;             
 //Listen类的构造器 
 public Listen(chatApplet p,String n,Socket s)   
	{
     //接受参数
	 parent=p;
	 name=n;
	 socket=s;
	 try
		{
		 //实例化两个数据流
	     dis=new DataInputStream(s.getInputStream());
		 ps=new PrintStream(s.getOutputStream());
	 }
	 catch(IOException e)
		{
	     System.out.println("Error:"+e);
		 parent.disconnect();
	   }
    } 
 //线程运行方法 
 public void run()                               
	{
      String msg=null;
	  while(true)
		{
	      //读取从服务器传来的信息		
	     try{msg=dis.readLine();}                 
		 catch(IOException e)
			{
		     System.out.println("Error:"+e);
			 parent.disconnect();
		 }
		 //如果从服务器传来的信息为空则断开此次连接
		 if (msg==null)                           
		 {
		   parent.listen=null;              
		   parent.soc=null;
		   parent.list1.clear();
		   return;
		 }
		 //用StringTokenizer类来实现读取分段字符
		 StringTokenizer st=new StringTokenizer(msg,":");   
		 //读取信息头即关键字用来识别是何种信息
		 String keyword=st.nextToken();                     
                 //如果是PEOPLE则是服务器发来的客户连接信息
		 if(keyword.equals("PEOPLE"))                      
		     //主要用来刷新客户端的用户列表
			{
		     parent.list1.clear();
		     //遍历st取得目前所连接的客户
			 while(st.hasMoreTokens())                     
				{
			     String str=st.nextToken();
				 parent.list1.addItem(str);
			 }
		 }
		 //如果关键字是MSG则是服务器传来的聊天信息
		 else if(keyword.equals("MSG"))                   
                 //主要用来刷新客户端聊天信息区将每个客户的聊天内容显示出来
			{
		     String usr=st.nextToken();
			 parent.chat_txt.appendText(usr);
			 parent.chat_txt.appendText(st.nextToken("\0"));
			 parent.chat_txt.appendText("\n\n");
		 }
		 //如果关键字是QUIT则是服务器关闭的信息
		 else if(keyword.equals("QUIT"))
		 //用来切断此次连接
			{
		     System.out.println("Quit");
		     try
		     {parent.listen.stop();
		      parent.listen=null;
		      parent.soc.close();
			  parent.soc=null;
             }catch(IOException e)
             {
             	System.out.println("Error:"+e);
             	}
			  parent.list1.clear();			 
			 return;
		 }
	  }
 }  
} 
}

⌨️ 快捷键说明

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