Server端:
 
import java.io.*;
import java.net.*;
import java.util.*;

public class ChatServer {
   boolean started = false;
  ServerSocket ss = null;
    
  List<Client> clients = new ArrayList<Client>();
    
   public static void main(String[] args) {
     new ChatServer().start();
  }
    
   public void start() {
     try {
      ss = new ServerSocket(8888);
      started = true;
    } catch (BindException e) {
      System.out.println( "端口使用中....");
      System.out.println( "请关掉相关程序并重新运行服务器!");
      System.exit(0);
    } catch (IOException e) {
      e.printStackTrace();
    }
    
     try {
        
       while(started) {
        Socket s = ss.accept();
        Client c = new Client(s);
System.out.println( "a client connected!");
         new Thread(c).start();
        clients.add(c);
         //dis.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
       try {
        ss.close();
      } catch (IOException e) {
         // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
    
   class Client implements Runnable {
     private Socket s;
     private DataInputStream dis = null;
     private DataOutputStream dos = null;
     private boolean bConnected = false;
    
     public Client(Socket s) {
       this.s = s;
       try {
        dis = new DataInputStream(s.getInputStream());
        dos = new DataOutputStream(s.getOutputStream());
        bConnected = true;
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    
     public void send(String str) {
       try {
        dos.writeUTF(str);
      } catch (IOException e) {
        clients.remove( this);
        System.out.println( "对方退出了!我从List里面去掉了!");
         //e.printStackTrace();
      }
    }
    
     public void run() {
       try {
         while(bConnected) {
          String str = dis.readUTF();
System.out.println(str);
           for( int i=0; i<clients.size(); i++) {
            Client c = clients.get(i);
            c.send(str);
//System.out.println(" a string send !");
          }
           /*
          for(Iterator<Client> it = clients.iterator(); it.hasNext(); ) {
            Client c = it.next();
            c.send(str);
          }
          */

           /*
          Iterator<Client> it = clients.iterator();
          while(it.hasNext()) {
            Client c = it.next();
            c.send(str);
          }
          */

        }
      } catch (EOFException e) {
        System.out.println( "Client closed!");
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
         try {
           if(dis != null) dis.close();
           if(dos != null) dos.close();
           if(s != null)    {
            s.close();
             //s = null;
          }
            
        } catch (IOException e1) {
          e1.printStackTrace();
        }
        
        
      }
    }
    
  }
}
 
客户端:
 
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatClient extends Frame {
 Socket s = null;
 DataOutputStream dos = null;
 DataInputStream dis = null;
 private boolean bConnected = false;
 TextField tfTxt = new TextField();
 TextArea taContent = new TextArea();
 
 Thread tRecv = new Thread(new RecvThread());
 public static void main(String[] args) {
  new ChatClient().launchFrame();
 }
 public void launchFrame() {
  setLocation(400, 300);
  this.setSize(300, 300);
  add(tfTxt, BorderLayout.SOUTH);
  add(taContent, BorderLayout.NORTH);
  pack();
  this.addWindowListener(new WindowAdapter() {
   @Override
   public void windowClosing(WindowEvent arg0) {
    disconnect();
    System.exit(0);
   }
   
  });
  tfTxt.addActionListener(new TFListener());
  setVisible(true);
  connect();
  
  tRecv.start();
 }
 
 public void connect() {
  try {
   s = new Socket("127.0.0.1", 8888);
   dos = new DataOutputStream(s.getOutputStream());
   dis = new DataInputStream(s.getInputStream());
System.out.println("connected!");
   bConnected = true;
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
 
 public void disconnect() {
  try {
   dos.close();
   dis.close();
   s.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  /*
  try {
   bConnected = false;
   tRecv.join();
  } catch(InterruptedException e) {
   e.printStackTrace();
  } finally {
   try {
    dos.close();
    dis.close();
    s.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  */
 }
 
 private class TFListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
   String str = tfTxt.getText().trim();
   //taContent.setText(str);
   tfTxt.setText("");
   
   try {
//System.out.println(s);
    dos.writeUTF(str);
    dos.flush();
    //dos.close();
   } catch (IOException e1) {
    e1.printStackTrace();
   }
   
  }
  
 }
 
 private class RecvThread implements Runnable {
  public void run() {
   try {
    while(bConnected) {
     String str = dis.readUTF();
     //System.out.println(str);
     taContent.setText(taContent.getText() + str + '\n');
    }
   } catch (SocketException e) {
    System.out.println("退出了,bye!");
   } catch (EOFException e) {
    System.out.println("推出了,bye - bye!");
   } catch (IOException e) {
    e.printStackTrace();
   }
   
  }
  
 }
}