服务器端 
import java.awt.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.awt.event.*; 
public class ChatServer extends Thread { 
public final static int PORT=8888; //服务器侦听的端口 
ServerSocket ss; 
java.awt.List user_list; //在服务器端显示用户的列表 
Vector users; //存放当前在线的用户名 
Vector connections; //存放当前在线的用户名 
String username; 
//当一个用户退出是,将起对应的信息系统再系统中删除 
public synchronized void removeUser(String un,Connection con){ 
user_list.remove(un); 
users.remove(un); 
connections.remove(con); 

public ChatServer(){ 
super("Server"); 
try{ 
ss=new ServerSocket(PORT); 
}catch(IOException e){ 
e.printStackTrace(); 

//生成显示窗口 
Frame f=new Frame("Sever Monitor"); 
user_list=new java.awt.List(30); 
f.add("Center",user_list); 
f.setSize(500,200); 
f.addWindowListener(new closeWin()); 
f.show(); 
users=new Vector(); 
connections=new Vector(); 
start(); 

public void run(){ 
try{ 
while (true){ 
Socket s=ss.accept(); 
Connection c=new Connection(s,this); 
//检查用户名是否与已有的相同 
username=c.readData(); 
while(users.contains(username)){ 
c.writeData("error"); 
username=c.readData(); 

c.writeData("right"); 
c.username=username; 
c.start(); 
//向其它用户发送信息 
serverWriter("用户"+username+"加入",false,null); 
//将新用户加入系统中 
synchronized(users){ 
users.addElement(username); 
connections.addElement(c); 
user_list.add(username); 

//再新用户的窗口内显示已有的用户的信息 
Enumeration em=users.elements(); 
while(em.hasMoreElements()){ 
String str=(String)em.nextElement(); 
serverWriter("用户:"+str,true,username); 
//} 
//在客户端显示用户列表 
//int i; 
//String str1; 
//String slist[]; 
//slist=user_list.getItems(); 
//for (i=0;i<30;i++ ) 
//{ 
//str1=slist[i]; 
//serverWriter(str1,true,username); 


}catch (IOException e){ 
e.printStackTrace(); 


public static void main(String[]args){ 
new ChatServer(); 

class closeWin extends WindowAdapter{ 
public void windowClosing(WindowEvent e){ 
Frame frm=(Frame)(e.getSource()); 
frm.dispose(); 
System.exit(0); 


/*将信息发送给相应的用户,str为要发送的信息,w表示为私聊,此时在un中存放聊天的 
对象的用户名。w假表示非私聊,此时un无意义。*/ 
public synchronized void serverWriter(String str,boolean w,String un){ 
Enumeration em=connections.elements(); 
if(w) 
while(em.hasMoreElements()){ 
Connection c=(Connection)em.nextElement(); 
if(c.username.equals(un)) 
c.writeData(str+"\n"); 

else 
while(em.hasMoreElements()){ 
Connection c=(Connection)em.nextElement(); 
c.writeData(str+"\n"); 



class Connection extends Thread{ 
ChatServer cs; 
Socket s; 
DataInputStream dis; 
DataOutputStream dos; 
public String username; 
String talker=null; 
boolean whisper; 
public Connection(Socket s,ChatServer cs){ 
this.cs=cs; 
this.s=s; 
try{ 
dis=new DataInputStream(s.getInputStream()); 
dos=new DataOutputStream(s.getOutputStream()); 
}catch (IOException e){ 
e.printStackTrace(); 


public void run(){ 
String temp; 
try{ 
while (true){ 
temp=readData(); //读数据 
//显示数据 
cs.serverWriter("["+username+"]"+temp,whisper,talker); 
} }catch (IOException e){ 
}finally{ 
close(); 


public void close(){ 
try{ 
dis.close(); 
dos.close(); 
s.close(); 
}catch (IOException e){} 
cs.removeUser(username,this); 
cs.serverWriter("用户"+username+"退出",false,null); 

public String readData() throws IOException { 
String temp=dis.readUTF(); 
if(temp.charAt(0)==&acute;#&acute;){ //如果是私聊,则提取出谈话的对象 
whisper=true; 
int kk=temp.indexOf(&acute;#&acute;,1); 
talker=temp.substring(1,kk); 
return new String(temp.substring(kk=1)); 

whisper=false; 
return new String(temp.substring(1)); 

public void writeData(String str){ 
try{ 
dos.writeUTF(str); 
dos.flush(); 
}catch (IOException e){ 
e.printStackTrace(); 



谢谢了,各位