基于java的聊天室系统总结

举报
运气男孩 发表于 2021/12/13 23:57:49 2021/12/13
【摘要】 一、实验目的1.1 实验背景根据教学培养计划的要求,在《面向对象框架技术及应用》课程中需开发一个完整的项目,该项目中涵盖的知识点要全面,需要包含《面向对象程序设计》中的主要知识点。根据教学计划和教学进展,以及教学内容,有选择性和针对性的设计了《面向对象框架技术及应用》这门课程的开发项目。1.2 实验意义通过本项目的课程设计,可以有效的加深学生对Java面向对象程序设计的基础知识的影响,提升学...

一、实验目的

1.1 实验背景

根据教学培养计划的要求,在《面向对象框架技术及应用》课程中需开发一个完整的项目,该项目中涵盖的知识点要全面,需要包含《面向对象程序设计》中的主要知识点。根据教学计划和教学进展,以及教学内容,有选择性和针对性的设计了《面向对象框架技术及应用》这门课程的开发项目。

1.2 实验意义

通过本项目的课程设计,可以有效的加深学生对Java面向对象程序设计的基础知识的影响,提升学生的专业知识能力和实际动手能力,同时让学生了解实际项目开发中的基本过程和增加学生的开发经验

从设计角度来讲,该系统根据学校和企业对面向对象框架技术及应用这门课程的要求,培养学生的实际操作能力,和专业技术能力,让学生能够掌握技术的同时,了解企业开发中的企业要求

二、实验内容

本系统提供了用户注册、用户登录、找回密码、首页退出、查看在线人员名单、群聊和私聊、账号注销、修改密码、主页退出等基本功能


三、实验过程

3.1 首页注册功能

3.1.注册功能业务逻辑和代码逻辑

注册功能业务逻辑

客户端操作:首先,获取用户注册信息展示登录界面,然后将注册的用户信息对象发送给服务器接收服务端返回的注册结果信息

服务端操作:接收客户端发送过来的用户注册信息将用户注册信息添加到数据表中将注册结果返回给客户端

数据库操作:获取数据库的连接信息,开启事务,然后获取数据库操作对象,进行SQL预编译,执行sql语句进行插入数据,然后提交事务,最后回滚事务防止异常。

代码逻辑

page页面下封装registerPage()方法,用于返回用户登录信息并提示输入信息,用正则表达式限制注册格式,然后来判断密码或邮箱格式错误次数过多在客户端的的系统首页下,调用page的registerPage()方法,返回的用户信息给registerUser对象,再通过objectOutputStream.writeObject将用户信息发给服务端,再通过objectInputStream.readObject()流读服务端发送过来的注册结果信息,并显示在控制台。

服务端先接收到客户端的用户信息,然后将用户注册信息添加到数据表中将是否添加成功的信息用字符串保存,再通过objectOutputStream.writeObject

发送回客户端。

数据库封装好了addUser方法,用来向数据表插入一条对应字段的用户信息,先开启事务connection.setAutoCommit(false)然后执行insert语句进行插入一条用户信息,返回查询结果集,再connection.commit()提交事务。

3.2 首页登录功能

3.2.1登录功能业务逻辑和代码逻辑

登录功能业务逻辑

客户端操作:首先客户端显示登录页面然后获取用户输入的登录信息将用户的登录信息发送给服务端最后再验证用户是否已登录过本系统登录过就结束循环,否则就接受服务端返回的登录结果接着判断登录成功的结果,如果登录成功跳出循环,否则错误三次会退出系统。

服务端操作获取客户端登录的用户信息判断用户是否登录过本系统没登录过就去数据库中校验用户登录信息(查找有没有要登录的账号)然后在服务端控制台打印一下用户上线信息,再将登录成功的用户信息存在map集合里。

数据库操作:获取数据库的连接信息,开启事务,然后获取数据库操作对象,进行SQL预编译,执行sql语句进行插入数据,然后提交事务,最后回滚事务防止异常,然后关闭资源。

代码逻辑

page页面下封装login()方法,用户根据提示输入数据后,然后返回用户输入的登录信息

客户端将login()方法返回的用户信息给一个loginUser对象,再通过objectOutputStreamwriteObject(loginUser)方法将loginUser里的用户信息发送给服务端,通过定义的boolean flag接收服务端信息

验证用户是否已登录过本系统如果登录过,则提示然后退出循环,否则服务端返回的登录结果最后再进行一个密码输入过多次数的判断,等于3次就退出系统。

服务端首先objectInputStream.readObject()获取客户端发过来的登录信息,然后通过map.containsKey判断该key用户名)map中是否有key存在。如果存在则返回true,有则是登录了本系统,则通过objectOutputStream.writeObject(true)向客户端发送true,没有登录系统则会向服务端发送flase代表没登录过,然后new一个数据库操作对象,调用封装好的findUser方法,去数据库里校验是否存在这个用户,存在就向客户端发送登录成功的消息,然后通过map.put方法将登录成功的用户信息通过键值对的形式保存在集合里。

数据库就是封装了一个findUser方法,通过select语句查询是否有用户输入的用户名和密码,如果有,就判断登录的标记置为true,返回给服务端。


3.3 首页找回密码功能

3.3.1 找回密码功能业务逻辑和代码逻辑

业务逻辑

客户端操作:首先客户端显示找回密码界面将用户找回密码信息发给服务端判断用户是否找到密码如果找回就显示他的密码,如果邮箱和用户名错误次数过多就会退出系统。

服务端操作:从客户端获取用户的找回密码信息去数据库中找回密码将用户的密码返回给客户端,null是账户密码错误导致没有找到,有值代表找到了找到在服务端打印用户成功找回密码信息。

数据库操作:通过数据库操作从数据表里查询对应的用户名和邮箱是否正确,正确则返回密码给服务端,服务端转发给客户端进行显示给用户。

代码逻辑

客户端首先调用page下面封装好的findUser方法进行显示找回密码界面,然后通过objectOutputStream.writeObject将找回密码信息发送给服务端,然后objectInputStream.readObject接收服务端返回的密码信息,如果不为null,则显示密码给用户。再定义一个findCount统计输入错误的次数,达到3次就退出系统。

服务端先读客户端发送来的找回密码信息然后给定义的User实体类的find对象,new一个数据库操作对象,调用findPassword方法,如果有值就是找到了,将其密码发给客户端。

数据库封装了一个findPassword方法,通过select语句和where限制查询对应用户的密码,最后通过调用返回给服务端,服务端转发给客户端。

 

3.4 首页退出功能

3.4.1 退出功能业务逻辑和代码逻辑

System.exit(1);直接非正常退出,就是说无论程序正在执行与否,都退

3.5 主页查看在线人员名单功能

3.5.1 查看在线人员名单业务逻辑和代码逻辑

业务逻辑

客户端:创建两个线程,一个用来向服务端发送消息,一个用来接收服务端的消息。在客户端的发送线程里,先展示主页功能信息,然后获取用户选取的功能发送给服务端。

服务端:首先接收客户端发送过来的功能数字字符串然后遍历map集合里的key值,然后将所有的key发送给客户端的接收线程。

代码逻辑

客户端new了两个新线程,发送端线程在创建的时候开启,接收端后开启。通过thread.join()方法使接收线程执行完了才执行主线程。客户端发送线程,调用indexPage方法显示主页功能信息,然后通过PrintWriter流发送功能字符串给服务端,然后客户端接收线程接收服务端发过来字符串,显示给控制台。

服务端是通过BufferedReader接收客户端发送线程发过来的功能字符串,再根据数字选项进入switch,然后定义字符串来存放用户信息,通过for高级循环来遍历map集合里的key值,保存到string里发送给客户端接收线程,最后显示给控制台。

3.6 主页私聊功能

3.6.1 私聊业务逻辑和代码逻辑

业务逻辑

客户端发送线程:先显示给用户需要发送私聊的格式,等用户输入后,将私聊的信息发送给服务端。

服务端:接收到客户端私聊的信息,将其格式进行分割,获取用户名和消息,再将消息写给私聊的用户名,客户端接收线程读取这条消息,然后显示在控制台,对应的用户就会收到这条消息。

代码逻辑

客户端发送线程页面调用page页面的privateChat方法,scanner获取用户输入的私聊信息,将其返回的私聊信息发送给服务端。

服务端用BufferedReader来读客户端发送线程的私聊消息,通过substring将其分割成username和私聊信息两部分,再从map集合里通过map.get找到需要私聊的用户,将消息发送给他。最后会被客户端的接收线程读取,显示在控制台。

 

3.7 主页群聊功能

3.7.1 群聊业务逻辑和代码逻辑

业务逻辑

客户端发送线程定义字符串来保存用户输入的需要群发的消息,然后发送给服务端。

服务端接收到客户端发送过来的群发消息,通过遍历集合发送给所有在线的客户端,再通过客户端接收线程读取,最后显示在控制台。

代码逻辑

客户端发送线程先定义一个string来保存通过scanner输入的群发信息,然后通过printwrite流发送给服务端。

服务端通过BuffReader流读取到群发消息,再通过for高级循环将群发消息发送给map集合的所有scoket,然后通过客户端的接收线程读取,最后挨个显示在对应的控制台下。

3.8 主页账号注销功能

3.8.1 账号注销业务逻辑和代码逻辑

业务逻辑

账号注销主要是服务端操作,首先将当前用户从集合里移除,然后创建数据库操作对象,将其从数据库中删除掉,再给客户端发送退出主页的请求。

代码逻辑

通过map.remove移除当前用户,然后在获取数据库操作对象,调用其deleteUser方法,从数据库中删除,再给客户端发送exit关键字,进行匹配,等于exit就会退出主页。

 

3.9 主页修改密码功能

3.9.1 修改密码业务逻辑和代码逻辑

 

业务逻辑

客户端发送线程将调用changPwd方法的返回值修改密码信息发送给服务端,然后阻塞线程0.5秒,给服务端响应的时间,防止显示过快。

服务端读取客户端发送过来的修改密码信息,创建数据库操作对象,调用封装好的修改密码方法,修改成功则向客户端接收线程发送修改成功字符串,否则修改失败。

数据库先是通过用户名和旧密码查询对应的用户记录,然后更新其密码为新密码,最后返回结果给服务端,服务端转发给客户端。

代码逻辑

客户端发送线程通过printwrite流将用户输入的修改密码信息发送,然后sleep当前线程。

服务端通过BuffRead流读取修改密码信息,创建DBOperator对象,调用changePassword方法对数据表进行操作,通过select和update进行对密码的查询及更新。

 

3.10 主页退出功能

3.10.1 退出业务逻辑和代码逻辑

业务逻辑

主要是服务端操作,分正常退出和强制退出,正常退出:先给客户端发送退出消息,然后将当前用户从集合里移除,再遍历集合通知所有在线用户说他已下线,最后在控制台打印他已退出;强制退出:用户直接关掉了客户端,捕捉这个读取客户端发送功能数字这部分代码的异常,然后集合移除当前用户,给客户端发消息退出系统,在服务端控制台打印用户强制退出。

代码逻辑

服务端通过PrintWrite流给客户端接收线程发送exit字符串,匹配到后会退出系统循环,然后map集合remove这个用户,在通过for循环给map集合里的所有value发送xxx已下线,控制台打印xxx退出系统;强制退出是try catch捕捉到客户端异常,再向客户端发送exit消息,remove掉当前用户,继续向上抛出一个异常,把用户主页也try catch,当用户强制关闭了,这里就会报异常。

关于java的聊天系统就说到这里了,如有不足之处,欢迎指正!

感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。