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

📄 chatapplet.java

📁 java聊天室。有3个部分。运行chatserver.
💻 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 + -