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

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);
}
}
}
}
...全文
1156 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)
大家期待已久的MyICQ 1.0终于发布了! 现在刚刚发布alpha1测试版本,还处于测试阶段,希望大家能够多多支持 MyICQ是一套完全公开源代码的即时通讯软件,包括服务器端和客户端,可以用于互联网或局域网中。可以运行在Windows或Linux(KDE/Qt)操作系统上,这是Windows的客户端。MyICQ完全支持服务器之间的松散连接,这意味着任何人都可以在Internet上架设自己的服务器。群组功能使您能够享受到聊天室和网络游戏所带来的快乐。 MyICQ 1.0新增加了两个非常非常重要的功能: 1) 服务器互联 采用"MyICQ号码@服务器地址"的统一编码方式,这样可以保证每台MyICQ服务器分配的号码不会重复,类似于现在的email系统。各个服务器在启动的时候谁也不必知道谁的存在,但是如果有人按照MyICQ号码添加其它服务器的好友的话,以后这台服务器就会出现在服务器列表中,所有的用户就可以随机查找这台服务器上的用户了。 2) 群组支持 包括聊天室和游戏平台。聊天室可以允许最多8个人一起针对某个话题聊天;游戏平台就像联众的游戏大厅一样,上面跑着各种各样的游戏(插件)。现在只有"五子棋",不过我们会不断的开发新游戏的。而且,相信随着MyICQ的流行,会有越来越多的人为MyICQ开发各种各样的游戏 大家可以到 http://cosoft.org.cn/projects/myicq 下载最新的MyICQ-1.0a1测试版本。如果大家觉得MyICQ很有前途,请推荐自己身边的好友来用MyICQ;如果觉得不好,或者有什么想法和意见,也请一定要通知我。 另外,胡正在很短的时间里编写了一个gaim的myicq-0.9插件,而且做的很不错。现在大家可以通过Linux 来访问MyICQ服务器了。不过目前还不支持MyICQ 1.0的一些新特性,胡正还在不断地完善它。gaim-myicq的最新版本可以也在http://cosoft.org.cn/projects/myicq下找到。 基本功能特 --------------- 收发(离线)消息(如果客户端之间能直接通讯,则通过TCP协议发送,否则通过服务器中转) 添加/删除好友(可以设置身份验证) 服务器端存储好友列表 在客户端存储好友资料和聊天记录 客户端与服务器端用DES的密钥加密方式通讯 支持代理服务器(SOCKS5/HTTP) 向一组在线好友发送消息 表情符号和选择字体 自动识别URL 系统管理员(MyICQ# = 10000)可以发送系统广播消息 皮肤系统 消息管理(可导入/导出聊天记录) 完全基于插件,使扩展更容易。目前提供的插件有: a. 收发文件 b. 二人世界(可以实时语音聊天) c. 闹钟提醒 支持服务器松散连接,采用uin@domain的形式 群组功能,包括聊天室和游戏大厅 ----------------------- 作者: 张勇(freeman) z-yong163@163.com

23,407

社区成员

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

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