我是一个新手,学习了Socket通信后,寒假花了20天写了这个小项目,只有一个客户端,而且也是一个尚未完工的客户端,服务器端只用来接收,转发或保存消息。本不准备发出来的,因为项目还在编写当中,实现的功能不多,且一些细节还没有处理好,以后还会再写一个比较细致的版本,不过老师要求了,就动手写了这篇总结。
项目名称:大山QQ,用以纪念我的大三。
项目意义:对相关知识点的一个综合练习,熟悉Java通信方面的类的用法及组件的应用,记录我大三的学习痕迹。
通信协议:字节流协议
功能:
1.注册
2.查找
3.添加/删除好友
4.添加/删除分组
5.好友上下线提醒
6.发送在线离线消息
7.发送在线离线文件
界面:全部采用空布局,所有组件都是通过setBounds(....)方法添加的
具体流程:
服务器端:
服务器端还没有怎么写,只实现了基本的消息传送功能。
开启服务器以后,首先读取所有的用户信息,等待客户端的链接。由于尚未学习数据库,所有的用户信息都是
以文件形式保存的。当开启服务器后,读取的所有用户信息都保存在辅助静态类ChatTool的一个用户Map<User_ID,User>中,当客户端连接上后,若为登录消息且ID和password都正确,则将Client_Thread(服务器端的用户通信线程类)添加至ChatTool类的线程Map<User_ID,Client_Thread>中,当客户端向流中写入消息后,对应服务器通信线程读取该消息,并作出对应操作。
客户端:
1.登录

账号密码框只能输入10位以内的数字0到9,实现方法有两种 1.添加DocumentListener 2.添加keyListener
具体见包MyComponent下的MyJTextField类
界面中的找回密码,设置只是按钮,还未添加功能。
若是账号密码均正确,服务器回发个人信息,包括账号,签名,头像,以及好友信息,未读消息等,建立缓存,存储好友的头像,然后转入好友列表界面。
这一步有待改进,头像的字节长度远远大于其他信息的字节长度,在本机建立好友头像缓存,可以减少信息的传输,提高通信速度。
改进方法:登录前检测本机好友头像的个数,传送登录信息时加上本机好友头像的好友ID,服务器只回发其他好友的头像以及更改了头像的好友头像即可。这一步更麻烦了,不过通信效率的提升很可观。
2.注册

做注册界面时,重要的就是在发送注册消息前先检测输入的数据是否合法,并予以提示

当所有的信息都无误了,再向服务器发送消息。若注册成功,服务器端保存用户信息,我最开始是用一个文件保存的,
后来做其他功能时发现要修改用户信息时会很麻烦,后改为每一项信息保存为一个文件。
注册成功,回发消息,提示,返回登录界面。
做注册功能的时候,我意识到应该要有容错处理,一切数据都合法的情况下再提交至服务器。
3.好友界面

界面上的所有图标都是JButton,setIcon(icon),没有什么用处,主要是仿QQ,以后添加功能方便些
JTree显示好友,头像,账号,昵称,是否在线,签名
具体功能有5个
1.添加/删除分组 2.删除好友 3.搜索用户(search) 4.双击好友头像,弹出聊天界面
4.用户查找界面

ID查找和昵称查找等的实现方法是相同的,所以就只做了一个ID查找
服务器读取要查找的用户ID,若存在就回发该用户ID,昵称等模糊查询回发的就是所有满足搜索条件的用户信息
当点击添加好友时,服务器接收到消息后首先检查被添加用户是否在线,在线发送消息,不在线就在被请求用户未读消息目录下的聊天消息下生成一个文件,写入消息。当被请求者用户上线时,服务器发送其信息时包含这些未读消息,同时删除未读消息文件。
这是另一个我觉得很重要的地方----要保证信息的不丢失
比如A请求添加B为好友,首先A向服务器发送请求消息,为保证B收到请求, 若B不在线,则将请求保存到B的未读文件中,在其上线时读取自身信息时(服务器在发送完温度消息后删除该消息),在通知B,若B在线则直接向其发送消息。B接收请求,选择分组,刷新界面,同时向服务器发送消息,服务器在保存信息,同时通知A结果,A在选择分组,刷新界面,再将结果发到服务器保存。
就是将客户端的一切改动都发到服务器保存下来。做修改个人信息的功能的时候,比如修改昵称,签名,密码等也是一样的
过程。
5.好友上下线提醒
我觉得这个功能的实现是这个项目最有价值的地方。采用了观察者模式。
具体做法如下:
自定义一个接口MsgListener,含有方法ReceiveMsgAction(Msg msg);
自定义一个接口subject,含有方法addMsgListener(MsgListener l),removeMsgListener(MsgListener l),
fireMsgListener(Msg msg);
客户端的通信线程类ClientThread继承Subject
定义类MyJTree_AsListeber extends JTree implements MsgListener ,重载ReceiveMsgAction(Msg msg),创建对象时,将之注册到对应的通信线程上。当对应通信线程类对象调用fireMsgListener(Msg msg)时,通知JTree对象作出相应显示刷新。
之前我一直都很追求外观,可当老师第一次讲到设计模式的时候,我才意识到纯粹的最求外观是没什么意义的,最重要的还是程序的结构,一个好的软件的设计应该是多种结构的综合,结构的好坏决定了程序的拓展性和可维护性。至于技术点,最好是能读懂源码,理解原理,这需要经验,现在的我还差得远,对于技术只停留在用的阶段,还未上升到理论。
6.聊天界面
视频语音截图震动功能都没实现
可以修改字体属性,传送消息,文件。未保存消息

震动的具体原理就是setLocation(x,y)方法的运用
截图,远程就是Robot类的应用
视频功能需要JMF的相关知识,还没有研究
7.传送文件
流程如下:1.在线文件的传送 先发送请求,对方同意后,开启一个服务器(有堵塞,应该放在线程中),回发给发送者,然后发送者连上该服务器,开启多个线程(我开启的是2个线程),分段传送文件,具体实现是RandomAccessFile类。
如DataImputStream类对象只能从文件的第一个字节开始读,但RandomAccessFile类对象可以随机读取文件,调用seek(x),或者skipBytes(X)方法,改变指针位置,就可以实现随机读取某一位置的字节。迅雷下载就是这种原理。开始,不清楚seek(x),或者skipBytes(X)方法是如何改变文件指针的,是读取X个字节再丢掉,还是直接改变指针在内存中的地址呢?经过测试,答案是后者。 2.离线文件的传送 由于只有一个通信I/o,传送文件应该另外创建Socket对象连上服务器,发送完文件后再关闭Socket。
项目的不足:
1.数据的存储 文件存储终究不如数据库存储,读取速度慢,性能低。只适合小群体的聊天
2.结构 虽然尝试使用了观察者模式,但客户端程序的耦合度还是比较高的,一个好的结构应该是多种设计模式的综合
3.功能 功能比较少,而且有缺陷,比如还没有加上远程,视频等功能,前几天已经把远程写好了,不过对图像的压缩度
感到不满意,其他功能的细节也有待改进,比如在添加好友时,我没有先判断是否请求对象已是自身好友等,都
是些细节的地方,还有修改个人信息的功能等等,这是都不难,但这些细节都决定着项目的友好性。很重要。
4.有一个问题没有解决,好友查找界面,表格刷新时会包空指针的错,没找到具体原因。
5.代码的结构不是很好,注解写的少了
6.没有创新 纯粹是技术的练习,尝试使用了一个设计模式,没有创新,没什么价值
收获:
1.意识到结构和友好的重要性
2.在调试的过程中,第一次意识到Java程序对系统内存,CPU的占用问题,意识到了一些小问题,比如读写文件不关流的话,就不会释放内存。
3.让我的心情很平静,不再浮躁
注:项目中的所有图片都是截图截下来的,在压缩包的图片文件夹中。

- 大小: 60 KB

- 大小: 81.7 KB

- 大小: 80.1 KB

- 大小: 97.4 KB

- 大小: 20.2 KB

- 大小: 107.4 KB
分享到:
相关推荐
基于万能逼近原理的自适应模糊控制算法在多自由度AUV运动控制中的应用与抗干扰补偿Simulink仿真研究,自适应模糊控制算法的万能逼近原理与多自由度AUV运动控制的抗干扰补偿技术——基于Simulink的仿真研究,万能逼近原理自适应模糊控制算法的多自由度AUV运动控制抗干扰补偿simulink仿真 ,核心关键词:万能逼近原理; 自适应模糊控制算法; 多自由度AUV运动控制; 抗干扰补偿; Simulink仿真。,基于万能逼近的模糊控制算法多自由度AUV抗干扰补偿Simulink仿真
deepseek最新资讯、配置方法、使用技巧,持续更新中
deepseek最新资讯、配置方法、使用技巧,持续更新中
结合扩展卡尔曼滤波与滑模观测器的策略:优化电角度估计,反电势波形逼近完美正弦波,结合扩展卡尔曼滤波与滑模观测器的反电势波形优化:正弦波形展现近乎完美精度,电角度估算与实际应用差异微小,扩展卡尔曼滤波与滑模观测器的结合,反电势波形近乎完美的正弦波形,观测器估算转子电角度与实际电角度相差0.3弧度左右,转速跟随效果较好。 ,核心关键词:扩展卡尔曼滤波; 滑模观测器; 反电势波形; 转子电角度估算; 转速跟随效果。,卡尔曼滑模观测器:优化正弦波转子角度与转速估算
毕业设计_基于springboot+vue的**学生公寓管理系统**【源码+sql+可运行】【**50217**】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - **业务管理:业务管理:公寓信息、房间信息、入住记录、学生信息** 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!
1、文件内容:xorg-x11-server-source-1.20.4-29.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/xorg-x11-server-source-1.20.4-29.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
1、文件内容:yum-plugin-ps-1.1.31-54.el7_8.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/yum-plugin-ps-1.1.31-54.el7_8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
基于模型预测控制(MPC)的无人船与无人车编队一致性协同控制研究(附原文献),基于模型预测控制(MPC)的无人船与无人车编队一致性协同控制研究(附原文献),无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV 带原文献 ,无人船编队; 无人车编队; MPC 模型预测控制; 多智能体协同控制; 一致性; MATLAB; USV; 原文献,无人系统协同控制:MPC模型预测控制下的多智能体编队与一致性研究(原文献支撑)
4套中级通信工程师综合真题及答案(2019,2020,2021,2023),适用于需要考中级通信工程师的人群
deepseek最新资讯,配置方法,使用技巧,持续更新中
基于matlab的锁相环PLL相位噪声拟合仿真代码集合:多个版本建模与仿真,高质量的锁相环PLL仿真代码集合:Matlab与Simulink建模研究,[1]锁相环 PLL 几个版本的matlab相位噪声拟合仿真代码,质量杠杠的,都是好东西 [2]锁相环matlab建模稳定性仿真,好几个版本 [3]锁相环2.4G小数分频 simulink建模仿真 ,PLL; Matlab相位噪声拟合仿真; Matlab建模稳定性仿真; 锁相环2.4G小数分频Simulink建模仿真,MATLAB仿真系列:锁相环PLL及分频器建模仿真
exceptionLogs.zip
基于光伏微网的经济性与并网负荷波动率双目标优化调度策略:蓄电池与V2G协同管理策略仿真研究,MATLAB下光储充微网结合电动汽车V2G的多目标协同调度策略研究:经济性与并网负荷波动性的对比分析,MATLAB代码:考虑V2G的光储充一体化微网多目标优化调度策略 关键词:光储充微网 电电汽车V2G 多目标优化 蓄电池优化 调度 参考文档:《光伏微网下考虑V2G补偿蓄电池容量的双目标优化调度策略》,已经投稿EI会议,中文说明文档可联系我咨询 仿真平台:MATLAB 平台 优势:代码注释详实,适合参考学习,相关成果已经采用,程序非常精品,请仔细辨识 主要内容:过建立光伏微网中以经济性和并网负荷波动率为双目标的蓄电池和V2G的协同调度模型。 采用粒子群算法,对电网、微网调度中心和电动汽车用户三方在无、无序、转移和调度V2G电动汽车负荷四种运行模式下的经济和安全影响进行对比。 最后,根据算例分析,求解四种模式下两级负荷曲线及经济收益表。 对比分析得出,引入V2G可以替代部分容量的蓄电池,使光伏微网在负荷峰谷平抑、三方经济和安全等方面进一步优化。 求解采用的是PSO算法(粒子群算法),求解效果极
javascript 动态网页设计期末大作业(自己手写的,高分期末作业),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期
混合智能体系统编队控制:分布式优化与15异构混合阶的挑战,异构混合阶智能体系统编队控制的分布式优化策略研究,15异构混合阶多智能体系统编队控制的分布式优化(无参考文献) ,核心关键词:15异构混合阶; 多智能体系统; 编队控制; 分布式优化; 无参考文献。,15混合阶多智能体系统编队分布式优化控制
javascript 动态网页设计期末大作业(自己手写的,很适合期末作业),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascrip
X光安检OPIXray数据集已经转换为VOC格式,可直接转换为为YOLO
DataX--Web:图形化界面简化大数据任务管理_datax-web
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!