基于乱七八糟功能的聊天室服务器与客户端—–菜鸡客户端的JAVA大作业

            <!-- wp:table -->
专业名称 计算机
班级学号 180119
学生姓名 张紫闻
指导教师 万聪

目录:

  1. 需求分析与思路总结
  2. 类图
  3. 核心代码展示
  4. 成果展示
  5. 程序存在的漏洞
  6. 总结
  1. 需求分析与思路总结:

该代码历时五天,每天编码时间接近于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。目的在于在这个里面,可以进行右键信息的复制粘贴与剪切。
    • 在服务器端,踢人下线的功能在实时显示信息界面。右键某个信息,将弹出菜单栏,其中强制下线的功能隐藏于此。
    • 回车触发按钮事件,比如发送添加,能实现的都实现了。
服务端的UML图
客户端的UML图
  1. 代码的漏洞和可改进的方面
    1. 消息的传输用的是String流,应该改造成Object流,和RMI一样,但是由于技艺不精,总想着怎么方便怎么来,因为以前写过一个基于文本的服务器和对话框,想着能不能直接照搬过来。于是就在这个地方卡了很久。事后才发现伙伴们一律的用的ObjectStream,方便的很,看来磨刀不误砍柴功。
      1. 因为是String流,有很多消息都会很尴尬,比如多行文本的传输,可能会触发未知的错误。
      1. 未能实时更改客户端的在线人数列表(由于时间问题)。
      1. 需要一个储存的介质,将私聊文本储存起来,避免私聊双方未同时打开窗口,接受不到消息这种Bug。
      1. UI好丑,需要美化
      1. java swing不太适合进行UI开发,下次用java写界面,参考用javaFX
  • 总结
    • 本次课设,历时5天,五天晚上有三天是两点之后睡的。足以证明我学习效率的低下。唉,其实写课设最大的花费是,花费到学习上面的时间。每想实现一个功能,都得查阅无数资料,才习得九牛一毛之功力。
    • 如果现在让我重构我的代码的话,我觉得最多两天,我能搭一个比现在这个好看,框架更有条理的代码出来。
    • 写大课设挺好玩的,几天时间一心一意的想实现自己内心任性的想法。其实我还有一个想法来着,但是估计是很难的。当初我选的是坦克大战,写了大概一天多点,然后觉得没什么难度,没什么挑战性,也就是代码量稍微大了点。
    • 然后我就想,我有个阿里云学生机,既然java是擅长于客户端,那课设不涉及网络方面,那岂不是枉学了一学期?然后就想着搞个服务器搭在阿里云上边,或者树莓派上边。太妙了。
    • 但是现在看来,非常不现实。因为就算用这台八代I5的游戏本跑服务器,现在也十分发热。估计是哪个线程死循环了,一直占用内存,并没有释放。代码写得好丑。
    • 哦对,java给我带来了很多启发。在实现一个功能之前,尽量不要留给下一个功能以问题,功能是一个个实现的。一个一个的调试,千万别一口气写完,然后慢慢DEBUG。
    • 还有一个令人震惊的消息,java的等于号竟然全都是赋值的意思。有个JTable组件的显示,就是因为这个原因,调了我一整天。
    • 基础知识还没过关,自以为在C++有点基础,不料来到java这儿全是钉子。
    • 几天时间,知识密度可能比整个学期的还要高。还有就是,自我学习效率有待提高,想休息了,想睡了,困了的时候,最好顺从自己的心思去休息一会儿。不然效率会很差。
    • 这次课设完了,想重新找个时间系统的学习java的网络编程。

最后的最后,!!!JAVA课设答辩得分96.

您可能还喜欢...

4 条回复

  1. 1f说道:

    紫闻你太棒了呀

  2. froleprotrem说道:

    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.

发表评论

电子邮件地址不会被公开。 必填项已用*标注