帮忙描述一下此客户端的功能是怎样实现的?各个类之间的关系是怎样的?每个类分别实现的什么功能?import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import java.io.*;
import java.util.*;public class ChatClient extends Applet {
    
   TextField UsName = new TextField(10); //姓名输入文本域
   TextField ChatFl = new TextField(30);  //聊天输入
TextField ObChat = new TextField(5); //聊天对象
   Button ConBtn = new Button("连接"); //连接按钮
   Button DconBtn = new Button("断开");
   Button SendBtn = new Button("发送");
   TextArea ChatArea = new TextArea(10,40); //显示聊天信息文本框
    java.awt.List UserList = new java.awt.List(11); //显示在线用户信息
  
    Socket socket=null;  //连接端口
   PrintStream ps=null; //输出流
   Listen listen=null;  //监听线程
  
   public void init() {  //Applet初始化
    ChatArea.setEditable(false);  //设置信息显示框为不可编辑   
    Panel panel1 = new Panel();  //实例化面板     
   Panel panel2 = new Panel();        
   Panel panel3 = new Panel();
   ObChat.setText("对 所有人");
   ChatArea.setBackground(Color.white);  //设置组件背景颜色
   panel1.setBackground(Color.orange);
   panel2.setBackground(Color.orange);    
    panel3.setBackground(Color.orange);     
    
    panel1.add(new Label(" 姓名:"));  //增加组件到面板上
    panel1.add(UsName);
    panel1.add(ConBtn);
    panel1.add(DconBtn);    
    panel2.add(ChatArea);
    panel2.add(UserList);    
    panel3.add(ObChat);
    panel3.add(new Label("内容:"));
    panel3.add(ChatFl);
    panel3.add(SendBtn);     
    setLayout(new BorderLayout()); //设置Applet布局管理器
    add(panel1, BorderLayout.NORTH);  //增加面板到Applet上
    add(panel2, BorderLayout.CENTER);
    add(panel3, BorderLayout.SOUTH);
   }   public boolean action(Event evt,Object obj){    //事件处理
   try{
if(evt.target==ConBtn){   //点击连接按钮
    if (socket==null){
  socket=new Socket(InetAddress.getLocalHost(),6000);     //实例化一个套接字                  
  ps=new PrintStream(socket.getOutputStream());   //获取输出流
  StringBuffer info=new StringBuffer("Login:");                                                              
  String userinfo=UsName.getText()+":"+InetAddress.getLocalHost().toString();
  ps.println(info.append(userinfo)); //输出信息
  ps.flush();
  listen=new Listen(this,UsName.getText(),socket);    //实例化监听线程
  listen.start();     //启动线程
}   
}
    else if(evt.target==DconBtn){    //点击断开连接按钮
         disconnect();  //调用断开连接方法
    }
    else if(evt.target==SendBtn){   //点击发送按钮
         if(socket!=null){
     String str = ObChat.getText().trim();
     if(str.equals("对 所有人")){
     StringBuffer msg=new StringBuffer("Connect:");     
 String msgtxt=new String(ChatFl.getText());
 ps.println(msg.append(ChatFl.getText()));   //发送信息  
 
 }
 else{
  int i,num;
  num=UserList.getItemCount();
  for(i=0;i<num;i++)
    if(str.equals(UserList.getItem(i))){
     StringBuffer msg=new StringBuffer("ConnectSl:");     
  String msgtxt=new String(ChatFl.getText());
  msg.append(ObChat.getText()+":");
  ps.println(msg.append(ChatFl.getText()));   //发送信息 
     }
    }
 ps.flush();
 }
 }
    }

catch (Exception ex){
ex.printStackTrace();  //输出错误信息
}
     return true;
   }      public void disconnect() {   //断开连接方法
      if(socket!=null){
ps.println("退出");  //发送信息
ps.flush();
  }
   }   class Listen extends Thread{    //监听服务器传送的信息
  String name=null;          //用户名
  BufferedReader reader ;    //输入流
  PrintStream ps=null;     //输出流
  Socket socket=null;      //本地套接字
  ChatClient client=null;   //客户端ChatClient实例  public Listen(ChatClient p,String n,Socket s) {  
  client=p;
  name=n;
  socket=s;   try{
    reader = new BufferedReader(new InputStreamReader(s.getInputStream())); //获取输入流
  ps=new PrintStream(s.getOutputStream());  //获取输出流 }
  catch(IOException ex){
     client.disconnect(); //出错则断开连接
     ex.printStackTrace(); //输出错误信息
    }
     }  
  
  public void run(){  
       String msg=null;
   while(socket!=null){
      try{
      msg=reader.readLine();  //读取服务器端传来信息
      }                 
  catch(IOException ex){
     client.disconnect(); //出错则断开连接
     ex.printStackTrace(); //输出错误信息
  }
  if (msg==null) {    //从服务器传来的信息为空则断开此次连接
    client.listen=null;              
    client.socket=null;
    client.UserList.removeAll();
    return;
  }
  StringTokenizer st=new StringTokenizer(msg,":");   //分解字符串
  String keyword=st.nextToken();            if(keyword.equals("newUser")) {    //新用户连接信息
      client.UserList.removeAll();  //移除原有用户名
  while(st.hasMoreTokens()) {    //取得目前所有聊天室用户名
      String str=st.nextToken();
  client.UserList.add(str);  //增加到用户列表中
  }
  }
  else if(keyword.equals("Connect")) {    //聊天信息                                                  
      String usr=st.nextToken();
  client.ChatArea.append(usr);  //增加聊天信息到信息显示框
  client.ChatArea.append(st.nextToken("\0"));
  client.ChatArea.append("\n");  
  }
  else if(keyword.equals("Quit")) {   //断天连接信息  
      System.out.println("Quit");
      try{
       client.listen=null;
       client.socket.close();  //关闭端口
   client.socket=null;
              }
              catch(IOException e){}
   client.UserList.removeAll();  //移除用户列表  
  return;
  }
   }
  }     
}
}     

解决方案 »

  1.   

    服务端的代码:
    import java.net.*;
    import java.io.*;
    import java.util.*;
    public class ChatServer { static int Port=6000;  //端口号
       static Vector Clients=new Vector(10);   //存储连接客户信息
       static ServerSocket SvSocket=null;    //建立服务器socket
       static Socket socket=null;   //套接字连接   public ChatServer() {
    try {
       System.err.println("Server start...");
         SvSocket=new ServerSocket(Port);    //初始化服务器套接字
    while(true){
         socket=SvSocket.accept();   //等待连接
         System.err.println(socket.getInetAddress()+"连接\n"); //得到客户机地址
         Client client=new Client(socket);  //实例化一个客户线程
        Clients.addElement(client);  //增加客户线程到向量中
        client.start();   //启动线程
    NfChatRoom();   //监视聊天室连接变化
    }
    }
    catch(Exception ex) {
         ex.printStackTrace(); //输出出错信息
    }
       }   public static void NfChatRoom() {
    StringBuffer newUser=new StringBuffer("newUser");
      for(int i=0;i<Clients.size();i++){
          Client c=(Client)Clients.elementAt(i);
      newUser.append(":"+c.name); //客户端姓名字符串
      }
      SdClientMsg(newUser);   //发送信息到客户端
       }   public static void SdClientMsg(StringBuffer message){
          for(int i=0;i<Clients.size();i++){
          Client client=(Client)Clients.elementAt(i); //分别得到每个客户端的连接
      client.send(message);  //发送信息
      }
       }   public static void SdSlClient(StringBuffer msge,String Name){
       for(int i=0;i<Clients.size();i++){
       Client client=(Client)Clients.elementAt(i);
       if(client.name.equals(Name)){
       client.send(msge);
       }   }
       }   public void closeAll() {   //关闭所有连接
          while(Clients.size()>0) {   //遍历整个Vector
    Client client=(Client)Clients.firstElement();  //得到一个客户端
      try{
          client.socket.close(); //关闭端口
      }
      catch(IOException ex){
          ex.printStackTrace(); //输出错误信息
      }
        Clients.removeElement(client); //移出客户端信息
    }
    }  public static void disconnect(Client c){     //断开客户端
    try{
      System.err.println(c.ip+"断开连接q\n");
          c.send(new StringBuffer("Quit"));   //向客户发送断开连接信息
      c.socket=null; //关闭端口
      }
      catch(Exception ex){
         ex.printStackTrace();
      }
        Clients.removeElement(c);   //移出客户端信息
       }    public static void main(String[] args) {
         new ChatServer();      //实例化一个ChatServer类
       }   class Client extends Thread  {
        Socket socket;    //连接端口
    String name;   //用户姓名
    String ip;    //客户端IP地址
      BufferedReader reader ;  //输入流
    PrintStream ps;   //输出流 public  Client(Socket s){
       socket=s;
       try{
           reader = new BufferedReader(new InputStreamReader(s.getInputStream())); //得到输入流
       ps=new PrintStream(s.getOutputStream());     //得到输出流
       String info=reader.readLine();   //读取接受到的信息
       StringTokenizer stinfo=new StringTokenizer(info,":");  //分解字符串
       String head=stinfo.nextToken();    //获取关键字
               if(stinfo.hasMoreTokens())
        name=stinfo.nextToken();     //获取用户名
       if(stinfo.hasMoreTokens())
        ip=stinfo.nextToken();    //获取IP地址
       }
       catch(IOException ex){
           ex.printStackTrace();
       }
    } public void send(StringBuffer msg) {
       ps.println(msg);   //输出信息
       ps.flush();
    } public void run(){
        while(true){
            String line=null;
        try{
          line=reader.readLine();  //读取数据流
        }
        catch(IOException ex){
           ex.printStackTrace(); //输出错误信息
       ChatServer.disconnect(this); //断开连接
       ChatServer.NfChatRoom(); //更新信息
       return;
        }     if(line==null){    //客户离开
       ChatServer.disconnect(this);
       ChatServer.NfChatRoom();
       return;
    }     StringTokenizer st=new StringTokenizer(line,":"); //分解字符串
        String keyword=st.nextToken();     if(keyword.equals("Connect")){  //发送来的是聊天信息
            StringBuffer msg=new StringBuffer("Connect:");
        msg.append(name);  //在信息上增加用户名
        msg.append(st.nextToken("\0"));
        ChatServer.SdClientMsg(msg);      //发送聊天语句到各个客户端
        }
        else if(keyword.equals("ConnectSl")){
        String SlName = st.nextToken();
        String SlMsg = st.nextToken("\0");
        StringBuffer msg=new StringBuffer("Connect:");
        msg.append(name+" say alone to you");
        msg.append(SlMsg);
        ChatServer.SdSlClient(msg,SlName);
        StringBuffer msg1=new StringBuffer("Connect:");
        msg1.append("you say alone to "+SlName);
        msg1.append(SlMsg);
        ChatServer.SdSlClient(msg1,name);
        }
        else if(keyword.equals("Quit")){  //退出命令
                     
                        ChatServer.disconnect(this);   //断开连接
        ChatServer.NfChatRoom();   //刷新信息
    }
    }
    }
    }
    }
      

  2.   

    注释很清楚啊,不知道如何继续解释楼主不明白的方法,就找java api手册对照着看里面的功能描述看看。或者直接上 jdk源码。相信这样收获会更大
      

  3.   

    ding
    api是绝对要看的
    不懂的可以google的
    一大段代码豆要人解释
    很不好的习惯
      

  4.   


    去看看这个通信项目 
    系统架构设计和实现有如下特点: 
    A. 采用 Accept-Connect 通讯模型,能统一管理系统中使用的所有 Socket 资源; 
    B. 系统支持通信和协议分离的实现原则,支持自定义协议解析模块;通信负责数据收发,协议负责数据鉴别,两者配合实现通信和协议的和谐工作; 
    C. 灵活支持业务处理功能重定义,分级支持慢业务和快业务的不同业务处理线程; 
    D. 丰富灵活的配置参数,能满足高扩展性; 
    E. 配合业务处理和通信模型,能异步的管理所有的交互步骤; 
    F. 分布式服务设计和部署,实现动态(热拔插)的增加和较少业务服务器,减少乃至拒绝单点服务; 
    为了更好的支持JNSP(java network services platform)项目的发展,现将项目发布到 code.google.com,项目命名为 java-nsp(jnsp已经给人用了,没有办法),项目主页是:http://code.google.com/p/java-nsp/ 1. 项目采用GPL v3 (http://www.gnu.org/licenses/gpl.html)开源协议,可以参考那个地址,不过我也没有完整的看过,估计也不怎么能看懂,嘿嘿; 2. 原来发布的所有版本都作废,以后统一用这个版本为准,维护也用这个空间; 3. 现在大肆招募开发人员(无偿劳动,开源奉献),有兴趣可留言联系;