Lazy loaded image
5️⃣Java局域网聊天软件
Words 3907Read Time 10 min
2024-10-2
2025-7-10
status
type
date
slug
summary
tags
category
icon
password
😀
前言:
好吧,实际上写到这我Java只入门了一周,学了一些MySQL和JDBC的基本使用,但秉承着分享和记录的理念,我还是想把这个入门之作写出来,这里也是第一次感受「多线程」的魅力。
上个学期在c++的学习中也学习到了多线程线程锁的概念,但是还没有正式运用到一个较为正式的项目中,这里也算是加深理解的第一个小项目。这里也在强迫自己的代码变得稍微规范一点,不要像之前的屎山代码一样了哈哈哈哈。 这里最中心的逻辑就是不管是客户端还是服务端发送信息都是利用特殊数据流,先输出一个int数字,便于分辨后续信息类型比如客户端先发1,代表接下来是登录消息,比如客户端先发2,代表接下来是群聊消息
 

📝 正文

先看一下这个项目的测试视频,这里方便录制我选择本地多开
 
 

服务器端

先来看看主线程吧
这里通过while循环来不断接受新客户端的链接,不断创建子线程来接受处理。

子线程处理

初步总结

  1. 最终,选择使用特殊数据流来收发数据是最为简便和有效的方案。这不仅能够有效地对不同消息进行区分与转发,还便于未来功能的扩展。本文档中仅展示了一个扩展 Thread 类并重写其 run 方法的示例,但从该示例可以看出,核心功能在于持续接收来自客户端的信息,并对其进行处理后转发至其他客户端。
  1. 这里借用了阿里开发的Druid的数据库连接池,它很好的优化了这个程序的性能,减少对数据库多次增删改查造成的不必要的时间浪费

技术细节

  • 字符串拼接:采用 StringBuilder 来提高字符串拼接的速度。
  • 时间记录:通过 LocalDateTime 获取当前时间,以便于日志记录或时间戳的生成。
  • 接发规范:严格按照先收发数字后发收数据的规范,增强代码可扩展性

遇到的问题及解决方案

在数据收发过程中发现,如果不每次操作后都调用 flush() 方法,则可能导致发送或接收失败,进而引起程序崩溃。为了解决这一问题,计划在未来加入线程锁机制以增强程序的安全性。

后续规划

目前,项目处于初步阶段,后续将继续完善,包括但不限于引入线程锁等措施来进一步提升系统的稳定性和安全性。

客户端

项目开发概述

初始构思

项目的初始阶段需要一定的时间进行构思,特别是在 GUI 界面的设计上。尽管我对一些常用的 API 有所了解,但独立开发一个既简单又美观的界面仍需花费不少时间。因此,我选择了使用通义千问来帮助我开发 GUI 框架。

使用通义千问开发 GUI

通义千问的代码逻辑非常清晰,具有良好的扩展性,并且提供了必要的提示,帮助我补充剩余的功能代码。通过多次提出具体要求,最终完成了一个较为美观且支持界面自由切换的 GUI 界面。

注册和登录界面

由于注册和登录界面相对简单,这里不再详细展示。目前,我对 MySQL 仅处于入门阶段,只掌握了部分基础操作,尚不足以实现复杂的联合编程。因此,现阶段仍然使用原始的服务端,通过 txt 文档来存储账号密码数据。

数据同步与处理

服务端在启动后会自动同步读取 txt 文档中的数据,并将其加载到内存中。这样可以方便地对客户端发来的登录和注册请求进行判断和处理。
好了到这里就可以开始真正的聊天界面的代码,这里并没有使用循环创建多线程,客户端都是运行在本地的一个信息收发端,只用一个子线程并发就行了,
到这里发现其实感觉还是太简单了,没有私聊怎么算是聊天项目呢是吧哈哈哈,然后又创建一个新的类,为了能最大程度延用之前的框架,选择不新创建窗口而是直接扩展这个现有的窗口

私聊界面

 
最后一下这个程序的大致框架,这里文件的命名我用了相对规范的方式,相信大家都可以理解
notion image

🤗 总结归纳

这个项目更多是为了练习多线程,再加上一些JDBC的运用和读写数据流和数组的练习,总体难度不是很高,但是对于我这初学者还是需要不断的试错选择更合理的方案了。 总结一下最后还是没有实现能够收发图片,这点很遗憾,我也会在后续学完mysql后再回来优化这个代码,到此先告一段落
 

补充-V2.1版本(添加控制面板)

 
 
💡
稍后我会把源代码上传至网盘与github,欢迎交流~~
上一篇
智能体团队
下一篇
Flare配置文件

Comments
Loading...