描述一下它的功能是怎样实现的?它的各个类之间的关系?每个类分别实现的是什么功能?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();   //刷新信息
}
}
}
}
}

解决方案 »

  1.   

    客户端的代码:
    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;
      }
       }
      }     
    }
    }     
      

  2.   

    代码好乱,贴代码用插入源代码的方式比较好点击回复框上的#号,选择插入代码类型,将代码放入中间[code=J ava][/c ode]
      

  3.   

    自己敲,debug下,跟下代码执行,
      

  4.   

    查JDK吧,这些类,jDK里的都有的
    像这种代码自己先调试运行起来
    然后自己在根据运行后的结果进行对程序修改
    这样学的应该比较快
      

  5.   


    去看看这个通信项目 
    系统架构设计和实现有如下特点: 
    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. 现在大肆招募开发人员(无偿劳动,开源奉献),有兴趣可留言联系;