目录1. 选题背景 (1)2. 开发技术概述 (1)3. 功能需求分析 (1)4. 功能设计 (2)4.1 登录界面功能表 (2)4.2 注册界面功能表 (3)4.3 聊天界面功能表 (4)4.4 文件功能表 (5)5. 系统流程分析 (5)5.1 系统总体设计流程图 (5)5.2 详细设计流程图 (6)6. 界面设计 (9)6.1 登录界面 (9)6.2 注册界面 (9)6.3 聊天界面 (10)7. 系统测试 (11)8. 关键代码说明 (13)小结 (16)参考文献 (17)1. 选题背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多.目前国内外做即时通讯软件的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡、淘宝旺旺等,国外有著名的MSN(新版改名为Live Messenger)以及跨平台的米聊等。
QQ是国内即时通讯软件市场上无可争议的“老大”,您使用QQ可以与好友交流,信息及时发送,及时回复,收发及时功能全面。
QQ与国外最大的即时通讯软件MSN功能强大,但它们唯一不足的地方就是必须要联网或者下载到它们的服务端,否则无法脱离Internet使用。
本聊天系统,是可以在局域网聊天的一个工具。
无需联网,即可进行群聊。
所以也存在局限性,只有在同一局域网内的用户才能聊天交流,除此之外,该系统未设置私聊功能。
2. 开发技术概述本系统采用java技术开发,使用文件保存数据,集成开发环境使用eclipse。
开发者应有java程序设计语言、SWING基本GUI组件、多线程、文件使用、socket编程、使用eclipse 的基本知识和技能。
系统采用两层c/s体系结构,c端负责通过GUI与客户交互,实现注册、登录、收发信息、退出等功能;c端和s端是通过网络交互的。
首先服务器启动,建立一个专门用于接收客户端请求的”倾听Socket”,然后等待客户的连接请求。
当客户想聊天时,从界面输入信息,然后与服务器建立Socket连接,服务器端的“倾听Socket”收到连接请求后,一般会接收连接请求,并生成一个服务器端socket,专门负责与此客户端socket的通信。
一旦连接请求成功,通过I/O流来实现数据的输入输出。
用多线程来实现多人聊天功能。
3. 功能需求分析使得第一次使用的用户可以通过填写个人信息来注册,已注册用户可以在验证他的登录信息后登录,允许在线用户查看其他在线用户的列表,允许用户在公共聊天室中聊天。
客户端和用户端的需求如下:a.客户端(1)用户注册界面及结果(2)用户登录界面及结果(3)用户发送信息及结果(4)用户得到信息及结果(5)用户退出界面及结果b.服务器端(1)处理用户注册(2)处理用户登录(3)处理用户发送信息(4)处理用户退出(5)保存服务器日志(6)保存用户聊天信息4.功能设计4.1 登录界面功能表表4-1登录功能表表4-2注册功能表表4-3聊天功能表4.4 文件功能表表4-4文件功能表5. 系统流程分析5.1 系统总体设计流程图聊天应用程序包括登录界面和注册界面,当启动登录界面,用户填写信息后登录,登录的信息将反馈给聊天服务器,服务器验证用户信息,若验证成功则跳到聊天界面,否则,服务器反馈给登录界面拒绝登录消息。
启动注册界面,用户在界面填写注册信息,注册信息反馈给服务器,服务器要验证用户信息,验证成功,跳到登录界面,否则,服务器反馈给注册界面,显示错误消息。
图 5-1系统总体流程图5.2 详细设计流程图1. 服务器结构服务器端,处理用户的请求,当收到“来自定时器”消息时,服务器给客户反馈,客户端在聊天界面更新消息和在线用户信息;服务器收到“登录信息”请求时,验证登录信息,验证成功则更新聊天界面里的消息和在线用户信息,否则给客户端反馈“用户不存在”消息;当服务器端接收到“注册消息”请求时,服务器验证注册信息,若验证成功,将注册信息写入文件保存,并反馈给客户端“注册成功”信息,跳到登录界面,否则在注册界面给客户端反馈“用户已经存在”消息。
图5-2服务器结构流程图2. 客户端结构登录界面,将登录消息发送给聊天服务器,聊天服务器验证登录消息,如果验证成功将“欢迎”消息发送给登录界面,登录界面向用户显示聊天界面;如果验证不成功,则将拒绝消息发送给登录界面,登录界面显示错误对话框。
注册界面,同登录界面。
图5-3登录界面流程图聊天界面,服务器接收“来自定时器”的消息,随时更新消息和在线用户信息,若用户在聊天界面中单击“发送”按钮,服务器接收用户“发送”请求,服务器将用户的发送信息保存,向聊天界面,若用户退出,服务器收到用户“用户退出”请求,将在线列表中删除用户,并更新聊天界面里的消息和在线用户信息。
聊天界面将“来自定时器”的消息发送给服务器用户在聊天界面中单击“发送”按钮将“用户退出”消息发送给服务器聊天服务器更新消息和在线用户信息从在线列表中删除用户开始结束图5-4聊天界面流程图6. 界面设计6.1 登录界面运行Login.java程序会出现如下界面。
图6-1登录界面6.2 注册界面运行Resigter.java可出现如下界面,注册信息时,用户名不能为中文,程序采用了RandomAccessFile来随机读取文件,为单独设置类来处理中文字符,用户若注册用户名信息含有中文将无法读取,尽管注册成功,登录时将报错:用户名或密码错误。
图6-2注册界面6.3 聊天界面用户先注册,在登录,登录成功可以出现如下界面。
图6-3聊天界面7. 系统测试用户xiaowang和wang注册后登录聊天室,xiaowang在聊天室里发送消息:你好;wang 发送消息:好。
两个用户都能看到彼此所发的信息。
图7-1系统测试图7-2系统测试8. 关键代码说明表8-1关键代码表序号事件内容事件名对象名1 登录JButton b12 注册JButton b23 聊天JButton b34 发送JButton buttonsentpublic Connect(Socket inFromClient) {// 建立一个用户//vcList = new Vector<String>();String msg = " ";String mesg = " ";try {// 服务器端先读再写streamFromClient = new BufferedReader(new InputStreamReader(inFromClient.getInputStream()));//System.out.println("客户端连接成功");streamtoClient = new ObjectOutputStream(inFromClient.getOutputStream());//System.out.println("服务器反馈信息给用户");msg = streamFromClient.readLine();System.out.println("从客户获得的信息为: " + msg);if (msg.equals("来自定时器")) {streamtoClient.writeObject(vector);// 将指定的对象写入// ObjectOutputStreamstreamtoClient.writeObject(vcList);}else if (msg.equals("登录消息")) {msg = streamFromClient.readLine();System.out.println("客户信息为: " + msg);int ver = verify(msg);System.out.println("验证消息为: " + ver);if (ver == 1) {String colon = new String(":");int index = stIndexOf(colon);String username = msg.substring(0, index);System.out.println("usernaem-->>"+username);if (!(vcList.indexOf(username) >= 0)) {// 如果用户列表中不存在该用户则在列表中添加该用户streamtoClient.writeObject("欢迎");// addElement将指定的组件添加到此向量的末尾,将其大小增加// 1。
如果向量的大小比容量大,则增大其容量。
vcList.addElement((String)username);System.out.println("用户列表人数为:"+vcList.size());} else {//已经登录了streamtoClient.writeObject("欢迎");// System.out.println("用户列表人数为:"+vcList.size());streamtoClient.writeObject("拒绝登录");// 给客户端反馈信息}} else {streamtoClient.writeObject("该用户不存在");}}else if (msg.equals("注册消息")) {msg = streamFromClient.readLine();System.out.println("从客户端接收的信息为: " + msg);int ret = checkFile(msg);System.out.println("用户存在为0 " + ret);if (ret == 0) {streamtoClient.writeObject("用户已经存在");}if (ret == 1) {// 创建在文件中写入的文件流System.out.println( "在文件中写入信息");FileOutputStream out = newFileOutputStream("UsrPwd.txt",true);PrintStream p = new PrintStream(out);p.println();p.println(msg);p.close();streamtoClient.writeObject("注册成功");System.out.println( "注册成功");}}else if (msg.equals("用户退出")) {System.out.println( "用户退出");String remuser = streamFromClient.readLine();//boolean b = vcList.removeElement(remuser);//移除退出用户vcList.removeElement(remuser);}else {//发送信息message = message + msg;System.out.println("message:" + message);vector.addElement(message);//向聊天列表中添加用户发送的聊天信息streamtoClient.writeObject(vector);//反馈给用户现在的向量集合}}catch (Exception e1) {e1.printStackTrace();System.out.println("无法获取客户端的流对象" + e1);}// try...catch结束finally {try {inFromClient.close();} catch (IOException e2) {e2.printStackTrace();System.out.println("发生异常" + e2);}}小结本次系统设计总结,我将对我在做这次系统设计中遇到过的问题以及新学的内容进行总结。