我的聊天室源码公开...希望大家给点意见

xjl2306 2005-06-17 02:22:39
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);
}
}
}
}
...全文
1120 122 打赏 收藏 转发到动态 举报
写回复
用AI写文章
122 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglei9802 2005-08-08
  • 打赏
  • 举报
回复
wlei9802@163.com
谢谢
fzpfzpaaa 2005-07-08
  • 打赏
  • 举报
回复
真是高手,強列要求學習.
zpfeng@sytdc.com
謝謝!!
gaosj 2005-07-08
  • 打赏
  • 举报
回复
lovezhh21@163.com
谢谢了!
hm8328 2005-07-08
  • 打赏
  • 举报
回复
hm8328@163.com
谢谢...
学习...
jimcal 2005-07-08
  • 打赏
  • 举报
回复
jimcal@126.com

谢谢!俺也学习学习!

谢谢谢谢
fengguoliuhen 2005-07-07
  • 打赏
  • 举报
回复
qiufengzhidao@hotmail.com
lsj_smile 2005-07-07
  • 打赏
  • 举报
回复
欣赏高手
landeriny@163.com
chinafeng9999 2005-06-26
  • 打赏
  • 举报
回复
我都要啊
chinafeng9999@163.com
nickchai 2005-06-26
  • 打赏
  • 举报
回复
我也要一份...学习....
chixiaodeng 2005-06-24
  • 打赏
  • 举报
回复
chixiaodeng@sina.com
hlgcsdn 2005-06-24
  • 打赏
  • 举报
回复
谢了,服务器和客户端一起发给我吧
hlghot@hotmail.com
dingy29 2005-06-24
  • 打赏
  • 举报
回复
dingy29@163.com 谢了
hui_feng 2005-06-24
  • 打赏
  • 举报
回复
服务器和客户机我也全要,谢谢!
我的MAIL是 jaychen999@163.com
wangqiuli5552 2005-06-24
  • 打赏
  • 举报
回复
wang-l@neusoft.com

服务器和客户机我也全要,谢谢!
xiaowenand 2005-06-24
  • 打赏
  • 举报
回复
xiaowenand@yahoo.com.cn
chenxb1980 2005-06-24
  • 打赏
  • 举报
回复
chenxiaobinsdu@hotmail.com

服务器和客户机我也全要,谢谢!

junhuang09 2005-06-24
  • 打赏
  • 举报
回复
服务器和客户端一起发给我吧
junhuang09@yahoo.com 谢谢了!
raulchen 2005-06-24
  • 打赏
  • 举报
回复
服务器和客户端一起发给我吧
raulchen@tom.com 谢谢了!
aootb 2005-06-23
  • 打赏
  • 举报
回复
小弟也想要啊。麻烦哪位大哥能发一份给我。
aootb@yahoo.com.cn
先谢了。
liuyangerliu 2005-06-22
  • 打赏
  • 举报
回复
再顶
liuyangerliu@sohu.com
加载更多回复(102)

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧