基于乱七八糟功能的聊天室服务器与客户端—–菜鸡客户端的JAVA大作业
<!-- wp:table -->
专业名称 | 计算机 |
班级学号 | 180119 |
学生姓名 | 张紫闻 |
指导教师 | 万聪 |
目录:
- 需求分析与思路总结
- 类图
- 核心代码展示
- 成果展示
- 程序存在的漏洞
- 总结
- 需求分析与思路总结:

该代码历时五天,每天编码时间接近于14~16小时。
主要知识点如下:
- 远程方法调用(RMI):
- 在登陆界面接入时,首先调用远程对象,会将远程的数据库返回以对象流的方式返回回来。从而得到远程的数据(包括账号,密码,密保问题,密保密码),若连接成功,则显示登陆界面。
- 在该方法指导下,在服务器编写了一个称之为(FileMethod)的方法类,里面的三个函数均是进行文件操作的封装。
- 基于Socket的即时通讯:
- 登陆按钮按下时,在核对账号信息无误后,会触发第二个远程连接,这个远程连接是基于ServerSocket的。主要思路是:先写文字版的两个字符串流。
- 比如客户端向服务器发送 ALL—USERNAME—Msg这行消息。服、务器先讲该字符串读取,然后用String.split将其分割成三部分,从而识别,该消息是群聊消息,USERNAME是消息的发送者,Msg是要转发的消息。
- 客户端主要功能的实现:
- 群聊:有一个负责群聊的对话框,若有人发送了群聊消息,则在“群聊框”中显示。
- 群聊原理:向服务器发送以(ALL—)开头的字符串,已封装好,用户只需要输入想向大家发送的消息即可
- 私聊:双击左边用户栏,若双方同时在线,并均打开私聊对话框,则能进行即时通讯。
- 私聊原理:向服务器发送以(P—USERNAME—Msg)格式的字符串,以封装好,直接在私聊对话框发送即可。
- 还没添加的功能:(若在线,则能够打开私聊对话框,否则,打开不了,由于时间关系未能实现。)现在是:无论是否在线均能打开。
- 私聊功能的BUG:必须,双方同时开启面向对方的私聊窗口,才能,该BUG的修复需要进行消息记录的储存,由于时间关系未能实现。
- 服务端主要功能的实现:
- 服务器的开关机(包括RMI和ServerSocket,给ServerSocket的开启开了个新的线程)
- 在线用户的实时显示
- 实现原理:服务器里面有一个静态的map映射数组,关键字是用户名,值是对应的Socket。每一个用户登陆,均会在map中进行添加。每一个用户登出,均会在map中进行删除。(若客户端关闭,则会触发窗口关闭事件,将向服务器发送exit命令,然后服务器在map中删除映射的同时,给客户端返回EXIT—的命令,将客户端关闭)(因为已手动关闭,所以该命令实际上并没有生效)。
- 全体下线:
- 实现原理:向map里面所有的socket的输出流中,向客户端发送(EXIT—)命令,(该命令是是执行客户端的窗口关闭指令)于此同时,客户端再向服务器发送exit命令,(将服务器的信息给清理)。从而实现良性循环。
- 某个用户强制下线:
- 实现原理如上。
- 为改善用户体验的较为边角的功能:
- 登陆界面,账号的下拉选项会显示所有用户的账号信息。随着用户账号的键入,下拉选项有自我填充功能。
- 忘记密码界面:随着账号的输入完成,密保问题一栏将会进行自动填充。
- 信息储存方面:若账号txt数据不慎丢失,服务器端将重新生成文件,并向其写进存有root账号的ArrayList动态数组对象。
- 文本域:MJTextField与MJTextArea均继承于JTextField或JTextField。目的在于在这个里面,可以进行右键信息的复制粘贴与剪切。
- 在服务器端,踢人下线的功能在实时显示信息界面。右键某个信息,将弹出菜单栏,其中强制下线的功能隐藏于此。
- 回车触发按钮事件,比如发送添加,能实现的都实现了。








- 代码的漏洞和可改进的方面
- 消息的传输用的是String流,应该改造成Object流,和RMI一样,但是由于技艺不精,总想着怎么方便怎么来,因为以前写过一个基于文本的服务器和对话框,想着能不能直接照搬过来。于是就在这个地方卡了很久。事后才发现伙伴们一律的用的ObjectStream,方便的很,看来磨刀不误砍柴功。
- 因为是String流,有很多消息都会很尴尬,比如多行文本的传输,可能会触发未知的错误。
- 未能实时更改客户端的在线人数列表(由于时间问题)。
- 需要一个储存的介质,将私聊文本储存起来,避免私聊双方未同时打开窗口,接受不到消息这种Bug。
- UI好丑,需要美化
- java swing不太适合进行UI开发,下次用java写界面,参考用javaFX
- 消息的传输用的是String流,应该改造成Object流,和RMI一样,但是由于技艺不精,总想着怎么方便怎么来,因为以前写过一个基于文本的服务器和对话框,想着能不能直接照搬过来。于是就在这个地方卡了很久。事后才发现伙伴们一律的用的ObjectStream,方便的很,看来磨刀不误砍柴功。
- 总结
- 本次课设,历时5天,五天晚上有三天是两点之后睡的。足以证明我学习效率的低下。唉,其实写课设最大的花费是,花费到学习上面的时间。每想实现一个功能,都得查阅无数资料,才习得九牛一毛之功力。
- 如果现在让我重构我的代码的话,我觉得最多两天,我能搭一个比现在这个好看,框架更有条理的代码出来。
- 写大课设挺好玩的,几天时间一心一意的想实现自己内心任性的想法。其实我还有一个想法来着,但是估计是很难的。当初我选的是坦克大战,写了大概一天多点,然后觉得没什么难度,没什么挑战性,也就是代码量稍微大了点。
- 然后我就想,我有个阿里云学生机,既然java是擅长于客户端,那课设不涉及网络方面,那岂不是枉学了一学期?然后就想着搞个服务器搭在阿里云上边,或者树莓派上边。太妙了。
- 但是现在看来,非常不现实。因为就算用这台八代I5的游戏本跑服务器,现在也十分发热。估计是哪个线程死循环了,一直占用内存,并没有释放。代码写得好丑。
- 哦对,java给我带来了很多启发。在实现一个功能之前,尽量不要留给下一个功能以问题,功能是一个个实现的。一个一个的调试,千万别一口气写完,然后慢慢DEBUG。
- 还有一个令人震惊的消息,java的等于号竟然全都是赋值的意思。有个JTable组件的显示,就是因为这个原因,调了我一整天。
- 基础知识还没过关,自以为在C++有点基础,不料来到java这儿全是钉子。
- 几天时间,知识密度可能比整个学期的还要高。还有就是,自我学习效率有待提高,想休息了,想睡了,困了的时候,最好顺从自己的心思去休息一会儿。不然效率会很差。
- 这次课设完了,想重新找个时间系统的学习java的网络编程。
最后的最后,!!!JAVA课设答辩得分96.
紫闻你太棒了呀
谢谢1f学长
I do enjoy the way you have presented this challenge and it does indeed supply me some fodder for thought. On the other hand, because of what precisely I have witnessed, I just simply wish when the remarks pack on that individuals keep on issue and not start upon a tirade involving some other news du jour. All the same, thank you for this superb piece and even though I can not really concur with it in totality, I regard the standpoint.
tkx very much! Your reply is very encouraging to me.tkx again