# 网络编程崔浩然小组qq聊天项目 **Repository Path**: cui-haoran123/wangluo ## Basic Information - **Project Name**: 网络编程崔浩然小组qq聊天项目 - **Description**: 这个qq项目是软件18-1班崔浩然小组的网络编程实验项目,组员为:申家宁,李琛琛,张琦,屈梦凡,吕亚洲,王宇利,侯熠,陈燕敏。应老师要求,结合所学知识UDP通信,线程,多线程,GUI界面设计,线程池以及NIO或IO实现类似qq的聊天交互系统。我们所实现的聊天系统实现了私聊与多人聊天,拥有登陆与注册账号功能,连接有数据库,大体上实现了简单的登陆注册聊天交互系统。 - **Primary Language**: Java - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 1 - **Created**: 2020-11-19 - **Last Updated**: 2024-11-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 网络编程崔浩然小组qq聊天项目 #### 介绍 这个qq项目是软件18-1班崔浩然小组的网络编程实验项目,组员为:申家宁,李琛琛,张琦,屈梦凡,吕亚洲,王宇利,侯熠,陈燕敏。应老师要求,结合所学知识UDP通信,线程,多线程,GUI界面设计,线程池以及NIO或IO实现类似qq的聊天交互系统。我们所实现的聊天系统实现了私聊与多人聊天,拥有登陆与注册账号功能,连接有数据库,大体上实现了简单的登陆注册聊天交互系统。 #### 设计方案 1、 界面设计 a、登陆界面 b、好友列表 c、 聊天框 所用到的方法: 对登录,注册账号,聊天互动,好友列表等功能的界面细节化。合理利用按钮,文本框,界面布局等实现合理美观的界面设计。 1.Jlable标签使用icon插入图片,使登录界面更加美观,使好友列表头像显示。 2.滚动框设计及会话与列表切换。 3.3个界面风格一致,大小适宜。 4.利用按钮设置需求功能等。 5.合理利用监听。连接各个功能,实现各功能之间转换。 6.好友分为多个列表由JTree实现。 2 登录功能 a、账号密码设置 b、注册功能 c、找回功能 功能分析: 1 账号密码设置,程序要对用户输入的账号密码进行判断是否正确。 2 新用户注册如何实现 3用户忘记密码或者更改信息如何进行 解决方法: 主要用到jdbc的知识和mysql。功能实现主要通过以下七步来实现。 第一步:首先通过MySQL建立一个用户信息数据库,数据库中包含:账号(int),密码(String),昵称(string),姓名(string),手机号(string),身份证号 (string)。 第二步: 注册驱动。Java中通过DiverManager.registerDriver这个类来注册驱动。 第三步:获取连接 “DriverManager.getConnection()”来连接数据库,返回一个connection类型的值。其中getConnection中有三个参数,分别是 url(String),user(string),password(string)。 第四步:获取操作对像。“connection.createStatement()”语句是获取操作对象。返回一个statement类型的值。 第五步:执行sql语句(DQL查询语句,DML增删改语句等)查询语句:statement.executeQuery(sql),返回一个String类型值,表示查询结果。增删改语句: statement.executeUpdate(sql),返回一个int型值,表示对数据库中更改数据的条数。 第六步:处理查询结果集(只有执行DQL语句时,才有该操作) 第七步:释放资源(使用完资源后一定要关闭,Java和数据库属于进程通讯,长时间开启会出现问题)。 #### 流程逻辑 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/112218_04b0e0a2_8333818.png "2.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/112239_8962d026_8333818.png "3.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/112249_3fd9ef7e_8333818.png "4.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/112152_115ec33b_8333818.png "5.png") #### 参与贡献 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/110100_fdefd4e3_8333818.png "1.png") #### 运行效果图 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125635_d27dcad3_8333818.png "6.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125648_70abc73c_8333818.png "7.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125700_e7775660_8333818.png "8.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125713_a2d1da0d_8333818.png "9.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125722_3048dd7b_8333818.png "10.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125733_a3996db0_8333818.png "11.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125743_1720aa8b_8333818.png "12.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125752_6a9a13d6_8333818.png "13.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/125807_37216885_8333818.png "14.png") #### 实现效果说明 在登陆界面设计了注册,登录以及忘记密码等功能。通过监听使每个功能实现。 在注册页面,设计了一些注册时需要的内容。又通过一些判断来使注册页面的账号, 密码等符合注册要求。注册和登录页面通过按钮监听连接起来。聊天界面与好友界面联系起来。 充分利用了文本框,按钮,等功能,分析布局的大小,确定各个组件方位,利用所学的知识 ,实现了文本框制作。加深对gui界面的学习理解。利用监听实现聊天界面与好友列表之间 的相互转化。好友列表采用卡片布局,设计多个面板,将首个需要显示的面板放于上层, 设计监听当点击好友或者群聊按钮时能够显示相应界面。好友的头像昵称通过JLable与 其中的Icon来实现,写一个数组通过流式布局来展示。将好友数组设置通用监听,点击哪 位好友并与其对话调用好友聊天界面。数据库与用户软件的连接,实现主要用到的就是jdbc。 当用户登录时,程序通过jdbc访问数据库,查询用户信息是否存在,若存在,则同时返回给服务 器和客户端,此时用户登录成功,否则返回该用户不存在。用户也可以进行注册,注册时 ,则是通过jdbc对数据库进行写操作,用户所写内容符合要求,则注册成功,否则重写输入。 用户也可以对自己信息进行修改,忘记密码也也已找回密码,以上功能是通过jdbc对数据库进行修改操作。 为了实现私聊的功能,首先想出实现的方法,即客户端发送带有识别其他客户 端的信息到服务端,服务端通过对好友树的遍历,进而寻找出想要发送的用户,将信息发送给对应的客户端 。实现方法想出来后,便开始着手去做,在实现的过程中,遇到了许多问题,比如,在实现客户端发送识别信息时, 遇到信息无法识别,也无法在控制台显示就全部关闭等问题,在对这些问题处理完成后,对输入输出流有了 更好的认识,也更加深了我对多线程的理解。当用户进行时私聊时,将当前用户名、聊天对象、聊天内容 和私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象 发送给服务器端。当用户发送聊天信息时,你需要对消息做一些包装(其中的包装格式有由你自己规定), 然后将信息传送 到服务器 后,你就需要对包装好的信息进行解析,然后获取你其中需要的信息。 服务端将会收到客户端用Socket传输过来的聊天信息对象,接收用户的聊天信息是由多线程技术实现的, 一个用户代表一个线程,服务器接到信息后根据对应的用户名找出对应socket,然后把消息发送到对应的 socket里面就好了。当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地 显示在聊天信息界面上。利用Socket实现客户端与服务器的连接,利用线程实现服务器连接多个客户端, 服务器,首先创建服务器套接字 ServerSocket对象并绑定端口(启动服务器),然后ServerSocket调用a ccept方法阻塞式等待接收一个客户端的请求,每接收一个请求就返回一个该客户端的Socket对象(有了 Socket对象就可以获得该客户端的输入输出流然后进行消息传送),开启 新一个线程去处理该客户端的 消息,比如客户端上线消息,客户端下线消息,私聊消息再进行相应的处理。客户端,根据服务器地址和 端口创建客户端套接字Socket对象,同上有了Socket对象就可以获得对服务器的输入输出流然后进行消 息读写,然后再创建一个线程监听处理服务器的消息,之后获取用户输入再发送给服务器。群聊的基本 思路是登录时进入好友列表,好友列表中有私聊和群聊,当点击群聊时就能进入群聊室,群聊室中有所 有已经登录的账号。聊天室右上角有在线账号,是点击群聊时将此账号加入在在线账号列表。当一个人 发信息时会通过在线账号的判断让服务器轮流给所有的在线用户发消息,确保他们能收到。发送消息使用 的是UDP,还有发送文件用NIO。 #### 个人感悟: 1810113001陈燕敏:我做的是登陆界面和注册界面设计,经过这次的学习,我对javaGUI界面设计有了更深的理解。对与GUI中各个部件以及功能也有了更深的理解,GUI界面图片的插入,不同部件的监听,页面的调用,以及不同部件的判断条件是不同的。这次的项目让我意识到自己的能力远远不够,还有许多东西需要去学习。 1810113003侯 熠:我做的是好友列表界面设计在实现好友列表GUI界面设计的过程中尝试了多种方式,并对不懂的地方进行了查找学习。为了使界面更加美化下了一些功夫,包括按钮隐形、更简洁的设置监听、获取好友昵称等进行来更深入的学习,得到了比较满意的效果,也对之前的知识进行了巩固。 1810113005王宇利:我做的是聊天界面的设计和实现。在自己动手的过程中,我渐渐地理解了每一行代码的意义,渐渐的有了比较完善的设计界面的思维。也填补了之前自己的不足。在小组合作中。交流学习心得,分享彼此的代码,对所学的知识有了一些拓展,促进了我们之间的交流,也让我对学习的内容有了新的理解。 1810113008崔浩然:我做的群聊功能连接实现和文档整理。这次实习让我对Socket编程的认识更加深刻的认识,很多东西单独放在一起没有太大难度,但是东西一旦多来,就要做好连接,就要传许多参数,这样就加大了难度,所以我感觉,有许多东西不要眼高手低,要着手去做才行。 1810113015李琛琛:我主要负责的是数据库与用户软件的连接,实现主要用到的就是jdbc。刚开始是觉得很简单,但实际做的时候存在着各种问题。这次实践让我深刻体会到了不能只注重理论知识的学习,要多进行实际联系才能更好的掌握所学知识。 1810113018吕亚洲:我做的私聊功能连接。通过做私聊对Socket认识进一步加深,对线程有了更进一步的学习,在实现的过程中,遇到了不少的困难,但通过查找学习,逐步解决了问题,掌握了许多新的知识。在实现过程中,首先要有明确的思路和大致的框架,在逐步去实现框架中内容,这样效率会更高。 1810113020屈梦凡:我做的私聊功能原理。先用没有使用GUI的代码,不使用多线程,仅仅针对服务端与客户端之间相互发送信息,在实现了这个后,开始修改客户端,客户端在私聊时需要添加标识符,以便识别各个用户,因此在服务端需要有识别的方法,同时需要创建一个用户类,用以标识。在不使用GUI使得功能实现后,便开始进行界面与功能的连接。 1810113021申家宁:我做的群聊功能实现。这次实习让我对Socket编程的认识更加深刻,很多东西单独学起来不难,也很容易实现,但是工程一旦扩大,难度变大不少。不过这正好让我对其理解加深。我在这次实习中主要负责群聊部分,这部分的实现主要是看着学习通的视频思路来弄,不过需要去改变,通过好友列表中的群聊按钮进入。这个改变开始老是有bug,不过和队友商量后可以解决了。 1810113027张 琦:我做的私聊功能主干。在进行私聊时遇到了一些困难,只能将客户端的信息传到服务器,无法将客户端的信息传到另一个客户端,遇到困难后及时百度,查询资料,询问同学,在一番努力下,才明白实现私聊时服务器要找到对应的socket,才能将信息传到目标客户端。在写代码的过程中,明白了在课堂上学习后,一定要在课后及时练习,不能眼高手低,理解代码不一定能实现功能。在小组合作中,交流学习心得,弥补自身的不足,促进自身的进步。