要实现聊天室,要有服务器和客户端。
一 、服务器:
我用了7个类:
1. myFrame:是主类,显示服务器界面,发布管理员消息,显示在线用户消息,踢人,对某一个人发布消息,
显示在线者聊天 的所有消息。
执行发信菜单项的功能
private void sendto1(int i) { final serverThread th=chatList.arr.get(i); JDialog jd=new JDialog(this,true);//发送对话框 jd.setLayout(new FlowLayout()); jd.setTitle("给"+th.user.getName()+"发送消息"); jd.setSize(400, 100); final JTextField jt=new JTextField(20);//写消息的文本框 JButton jb=new JButton("发送"); jd.add(jt); jd.add(jb); jb.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.out.println("发送了一条消息!"); String s="管理员对你说:"+jt.getText(); ja.append("管理员对"+th.user.getName()+"说:"+jt.getText()+"\r\n"); th.sendMessage(s);//发送消息 } }); jd.setVisible(true); jd.validate(); }
执行踢人菜单项功能
private void delp(int i) { chatList.removeClient(chatList.arr.get(i)); }
发消息给一个人
private void sendMessageall(String s) { for(int i=0;i<chatList.arr.size();i++){ serverThread ser=chatList.arr.get(i);//得到线程对象 ja.append(s+"\r\n"); ser.sendMessage(s);//调用线程类中的发消息方法,发送消息 }
2. chatList :服务器对客户机线程处理,转发消息的类
将每一个客户的对应的线程对象加入队列中:addClient(serverThread sc)
给每一个在线客户机发送 "**上线了!"的消息:castMsg(UserInfo ownU, String s)
将该线程对象从队列中移除: removeClient(serverThread sc)
3. UserInfo:是用户个人类
4. serverThread:对客户机连接对象处理的类
处理用户发送过来的信息: processchat()
发送信息: processchat(),字符串要以"\r\n"结尾
得到用户对象:getOwnU()
关闭连接并将线程从队列中移除:closeMe();
5. test1:启动服务器,调用accept()方法让服务器进入等待状态
6 .listInterfac:继承ListModel接口,对Jlist的ListModel进行处理
7 . 账号验证,数据保存、更改等功能实现:DaoTools。
用户数据保存在Map<String,UserInfo>中
验证用户消息:checkLogin(UserInfo user)
二 客户端:验证用户方法和连接服务器,然后聊天(内容通过服务器管理)
有3个类:
myFrame2:显示登录界面和聊天界面
MsgThead:用户登录成功的线程
test2: 对聊天线程进行处理
连接服务器,并将连接交给线程处理,认证用户: chatServer(String useName, String pwd)
读取服务器消息方法: readM()
客户发送消息:sendM(String s)
服务器接界面:
在线用户列表,可以给每一个人发信和踢人
给用户 2 发消息的消息框
客户登录界面
客户1的聊天界面 ,以及部分聊天消息!