zl程序教程

您现在的位置是:首页 >  Java

当前栏目

基于java的聊天室系统总结

2023-04-18 14:52:15 时间

一、实验目的

1.1 实验背景

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

1.2 实验意义

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

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

二、实验内容

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

三、实验过程

3.1 首页注册功能

3.1.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对象,再通过objectOutputStream的writeObject(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的聊天系统就说到这里了,如有不足之处,欢迎指正!