ServeFrame.java 为服务器端程序界面,负责为服务器的启动提供界面服务。 AppServer.java 为服务器端启动界面,负责监听服务器的状态,在线人数,最多在线人数,服务器名称,访问协议,服务器IP,服务器端口以及用户信息的管理,日志的保存。
Connection.java 是连接服务器和客户端的桥梁,主要负责将客户端的信息传送给服务器,并将服务器端的信息反馈给客户端,即所谓的“三次握手”。也是Socket编程的重要部分。
WordFilter.java 负责将聊天过程中不合法的话语文件等过滤掉,返回合法内容。
3.3.2 客户端结构
图3-4 客户端结构图
ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。 Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。
Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。 ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。
Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。
- 16 -
4 详细设计
4.1 系统流程图 4.1.1 系统总体流程图
开始启动服务器否判断启动信息是启动客户端判断登录信息是否注册用户登录聊天室是退出聊天室退出服务器结束图4-1 系统总体流程图
- 17 -
4.1.2 系统客户端流程图
开始客户端登录界面聊天室界面清屏聊天内容时钟保存退出聊天对象字体颜色表情结束 图4-2 客户端流程图 4.2 编写服务器端程序 4.2.1 问题陈述
1. 接受用户注册信息并保存在一个基于文件的对象型数据库。 2. 能够允许注册过的用户登录聊天界面并可以聊天。 3. 能够接受私聊信息并发送给特定的用户。 4. 服务器运行在自定义的端口上1001.
5. 服务器监控用户列表和用户聊天信息(除私聊外)。 6. 服务器踢人,发送通知。 7. 服务器保存日志。
- 18 -
4.2.2 解决方案 4.2.2.1 后台数据库设计
基于服务器跨平台运行的构想,服务器的后台数据库使用了SQL Server2000。
(1)login 表:
Login表
(2)register表
register表
此表主要包含了用户帐户基本信息。
聊天系统采用用户名作为用户帐号,并给每个用户生成一个唯一ID来做系统内部的用户标识。 4.2.2.2用户注册
1.去数据库读数据 首先创建一个File文件类,载入“user.txt”,再用对象输入流ObjectInputStream将用户信息导入到系统中。 2.客户端请求注册 客户端通过Register.java请求注册,填写注册信息,并验证密码是否符合规定,是否两次输入一致,如不一致会提示重新输入,最后将请求信息发送给服务器端。 int flag = 0; // 是否重名判断标志 Register_Customer clientMessage = (Register_Customer) obj; File fList = new File(\); if (fList.length() != 0)// 判断是否是第一个注册用户 { ObjectInputStream objInput = new ObjectInputStream( new FileInputStream(fList)); vList = (Vector) objInput.readObject(); - 19 -
// 判断是否有重名 for (int i = 0; i < vList.size(); i++) { Register_Customer reg = (Register_Customer) vList .elementAt(i); if (reg.custName.equals(clientMessage.custName)) { toClient.println(\注册名重复,请另外选择\); flag = 1; break; toClient.println(\禁止使用此注册名,请另外选择\); flag = 1; break; } else if (reg.custName.equals(\所有人\)) { 3.服务器端响应 服务器端得到注册请求会将对象输入流转化为文件输出流,并反馈给客户端。客户端得到注册信息后会在前台填写注册信息,然后创建文件输出流,再用对象输出流包装后写入本地文件将其持久化。最后关闭对象输出流和文件输入流。 // 将向量中的类写回文件 FileOutputStream file = new FileOutputStream(fList); ObjectOutputStream objout = new ObjectOutputStream(file); objout.writeObject(vList); 4.给客户端返回信息 将用户注册成功或失败的信息用打印流包装Socket以后,输出给客户端注册结果的详细信息。 // 发送注册成功信息 toClient.println(clientMessage.custName + \注册成功\); Date t = new Date(); log(\用户\ + clientMessage.custName + \注册成功, \ + \注册时间:\ + t.toLocaleString() + \); 5.关闭Socket连接 当以上的程序都正常运行后,需要关闭Socket连接,否则将会浪费服务器与客户端之间的资源。 4.2.2.3用户登陆 1.去数据库读用户数据 打开用户数据库文件“User.txt”,将用户数据对象集载入内存,以供下面的程序使用。 // 读文件 FileInputStream file3 = new FileInputStream(\); ObjectInputStream objInput1 = new ObjectInputStream(file3); vList = (Vector) objInput1.readObject(); - 20 -