我的聊天室源码公开...希望大家给点意见
package xu.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
/*
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
*/
/**
*
* 多线程聊天服务器
*
*/
/* main()方法在155行 */
public class ReceiveServer //定义ReceiveServer类----------------------
{
private final static List sendBuffer=new ArrayList();
final static Map clientSockets=new HashMap();
private final int RECEIVE_PORT=9090; //该服务器的端口号
ServerSocket rServer=null; //ServerSocket的实例
Socket socket=null; //用户请求的套接字
Thread ReceiveThread=null;
public ReceiveServer()
{ //ReceiveServer的构造器
try{
rServer=new ServerSocket(RECEIVE_PORT);//初始化ServerSocket
System.out.println("服务器启动...");
System.out.println("Welcome to the server!");
System.out.println(new Date());
System.out.println("The server is ready!");
System.out.println("Port: "+RECEIVE_PORT);
Thread sendThread=new SendThread(); //转到第161行来产生一个SendThread实例
sendThread.start(); //启动线程,转到第163行执行run()方法,无限循环调用本类中的113行的send()方法
while(true)
{ //等待用户请求
socket=rServer.accept(); //在死循环里不断接收客户机连接请求(accept()方法 产生连线)
ReceiveThread=new ServerThread(socket);//生成serverThread的实例
ReceiveThread.start(); //启动serverThread线程
}
}
catch(Exception e)
{
System.out.println(e.getMessage()) ;
}
}
public static void addBuffer(String msg)
{
synchronized(sendBuffer)
{
sendBuffer.add(msg);
sendBuffer.notifyAll();
}
}
public static void addSocket(String name,Socket socket)
{
synchronized(clientSockets)
{
clientSockets.put(name,socket);
}
}
public static void removeSocket(String name)
{
synchronized(clientSockets)
{
try
{
Socket socket=(Socket)clientSockets.get(name);
socket.close();
clientSockets.remove(name);
}
catch(IOException e)
{
System.out.println(e);
}
}
}
public static boolean logined(String name)
{
synchronized(clientSockets)
{
if(name==null||name.equals(""))
{
return false;
}
if(clientSockets.containsKey(name)) return false;
return true;
}
}
public static void send()
{
synchronized(sendBuffer) //对ArrayList同步 (List sendBuffer=new ArrayList())
{
while(sendBuffer.size()==0)
{
try
{
sendBuffer.wait();//等待72行唤醒
}
catch(InterruptedException e)
{
System.out.println(e);
}
}
ListIterator li=sendBuffer.listIterator();
while(li.hasNext())
{
String msg=(String)li.next();
li.remove();
synchronized(clientSockets) //对一个HashMap的实例同步
{
Set names=clientSockets.keySet();
Iterator iterator=names.iterator();
if (msg.startsWith("refresh!"))
{
msg="";
while (iterator.hasNext())
{
String name=(String)iterator.next();
msg=msg+name+",";
}
msg="refresh:"+msg;
iterator=names.iterator();
}
while(iterator.hasNext())
{
try
{
String name=(String)iterator.next();
Socket socket=(Socket)clientSockets.get(name);
OutputStreamWriter writer=new OutputStreamWriter(socket.getOutputStream());
PrintWriter output=new PrintWriter(writer,true);
output.println(msg);
}
catch(IOException e)
{
System.out.println(e);
}
}
}
}
}
}
public static void main(String args[])
{
new MangerWin();
new ReceiveServer();
}//end of main
} //结束ReceiveServer类-------------------------------------------------
class SendThread extends Thread
{
public void run()
{
while(true)
{
ReceiveServer.send();
}
}
}
/**
*
* 对应于每客户的线程类
* Preferences - Java - Code Style - Code Templates
*/
class ServerThread extends Thread
{
Socket socket; //用户连接的通信套接字
BufferedReader input; //输入流
PrintWriter output; //输出流
private boolean logined;
private String name;
public ServerThread(Socket socket)
{ //serverThread的构造器
this.socket=socket;
InputStreamReader reader;
OutputStreamWriter writer;
try
{ //初始化输入、输出流
reader=new InputStreamReader(socket.getInputStream());
writer=new OutputStreamWriter(socket.getOutputStream());
input=new BufferedReader(reader);
output=new PrintWriter(writer,true);
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
public void run()
{ //线程的执行方法
String command=null; //用户指令
boolean done=false;
while(!done&&!socket.isClosed())
{
if(!logined)
{
try
{
name=input.readLine(); //接收用户名
if(name!=null&&ReceiveServer.logined(name))//如果不存在,把它加进HashMap里
{
logined=true;
System.out.println(name+"成功登陆");
ReceiveServer.addSocket(name,socket);
output.println("欢迎您来到JAVA论坛室!");
}
else
{
output.println("系统提示:用户重复,请重新输入。");
socket.close(); //+
}
}
catch(Exception e)
{
System.out.println(e);
}
}
else
{
try
{
command=input.readLine(); //接收客户机指令
if(command!=null)
{
if(command.equalsIgnoreCase("QUIT"))
{ //命令quit结束本次连接
done=true;
break;
}
else
{
ReceiveServer.addBuffer(command); //向客户端发送消息
}
}
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
} //end of while
if(!socket.isClosed())
{
ReceiveServer.removeSocket(name);
//连接断开时,从HashMap里删掉用户
try
{
socket.close();
System.out.println(name+"用户已退出...");
}
catch(IOException e)
{
System.out.println(e);
}
}
}
}