java聊天室源码(二代)

JAVA聊天室(二代)代码仅为原来的一半!性能进一步提升,性能允许的基础上可连接无数客户端,改进了下线CPU占有暴增情况,实现指定人员聊天功能。。:管天阳的日志登录桌面登录后用户列表可以显示可指定人员单独聊天上线客户端提醒退出时列表可显示,每个客户端的用户项也将消失。。下面是代码:1.服务器:packagecom.zzk;importjava.awt.BorderLayout;importjava.awt.Frame;importjava.awt.Image;importjava.awt.MenuItem;importjava.awt.PopupMenu;importjava.awt.SystemTray;importjava.awt.TrayIcon;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.PrintWriter;importjava.ServerSocket;importjava.Socket;importjava.URL;importjava.util.Hashtable;importjava.util.Iterator;importjava.util.Set;importjava.util.Vector;importjavax.swing.ImageIcon;importjavax.swing.JFrame;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;publicclassChatServerFrameextendsJFrame{privateJTextAreata_info;privateServerSocketserver;//声明ServerSocket对象privateSocketsocket;//声明Socket对象socketprivateHashtable<String,Socket>map=newHashtable<String,Socket>();//用于存储连接到服务器的用户和客户端套接字对象publicvoidcreateSocket(){try{server=newServerSocket(1982);//创建服务器套接字对象while(true){ta_info.append("等待新客户连接......\n");socket=server.accept();//获得套接字对象ta_info.append("客户端连接成功。"+socket+"\n");newServerThread(socket).start();//创建并启动线程对象}}catch(IOExceptione){e.printStackTrace();}}classServerThreadextendsThread{Socketsocket;publicServerThread(Socketsocket){this.socket=socket;}publicvoidrun(){try{ObjectInputStreamins=newObjectInputStream(socket.getInputStream());while(true){Vectorv=null;try{v=(Vector)ins.readObject();}catch(ClassNotFoundExceptione){e.printStackTrace();}if(v!=nullv.size()>0){for(inti=0;i<v.size();i++){Stringinfo=(String)v.get(i);//读取信息Stringkey="";if(info.startsWith("用户:")){//添加登录用户到客户端列表key=info.substring(3,info.length());//获得用户名并作为键使用map.put(key,socket);//添加键值对Set<String>set=map.keySet();//获得集合中所有键的Set视图Iterator<String>keyIt=set.iterator();//获得所有键的迭代器while(keyIt.hasNext()){StringreceiveKey=keyIt.next();//获得表示接收信息的键Sockets=map.get(receiveKey);//获得与该键对应的套接字对象PrintWriterout=newPrintWriter(s.getOutputStream(),true);//创建输出流对象Iterator<String>keyIt1=set.iterator();//获得所有键的迭代器while(keyIt1.hasNext()){StringreceiveKey1=keyIt1.next();//获得键,用于向客户端添加用户列表out.println(receiveKey1);//发送信息out.flush();//刷新输出缓冲区}}}elseif(info.startsWith("退出:")){key=info.substring(3);//获得退出用户的键map.remove(key);//删除键值对Set<String>set=map.keySet();//获得集合中所有键的Set视图Iterator<String>keyIt=set.iterator();//获得所有键的迭代器while(keyIt.hasNext()){StringreceiveKey=keyIt.next();//获得表示接收信息的键Sockets=map.get(receiveKey);//获得与该键对应的套接字对象PrintWriterout=newPrintWriter(s.getOutputStream(),true);//创建输出流对象out.println("退出:"+key);//发送信息out.flush();//刷新输出缓冲区}}else{//转发接收的消息key=info.substring(info.indexOf(":发送给:")+5,info.indexOf(":的信息是:"));//获得接收方的key值,即接收方的用户名(因为substring起始索引包括,结尾索引不包括所...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

确认删除?