csms-Class Affairs Management System
班级事务管理系统
项目介绍
利用Java实现C/S模式的大学班级内日常事务管理系统(PC版,应用于校内网有线网络访问,暂不开发移动端),不得依赖现有的建模框架,使用swings技术完成如下基本功能需求:
1、 班级公告通知
2、 文稿匿名传阅投票
3、 文件共享(上传、下载)
4、 即时通信(一对一,多对多)
系统架构
采用C/S模式(重服务器,轻客户端),将任务合理分配到Client端和Server 端。充分利用硬件环境的优势,降低系统开销。
服务端与数据库相连,实现各种数据信息的添加,更新,查找和删除。服务器将处理好的数据传输到客户端,使客户端操作简单,使用方便。
系统模块
分为三个部分,服务器端,客户端,服务器和客户端共用模块。
服务器端:
- ServerHandle包:实现服务器端的各种功能,接收来着客户端的各种消息信息,并完成转发。
- Database包:与建立的数据库中的table一一对应,每个table都有对应的类进行功能实现,负责各种数据的添加,查找,删除和更新。
客户端:
- ClientHandle包:实现客户端的各种功能,可以向服务器发送消息信息,也可接收来自服务器的消息信息。
- View包:系统的所有用户界面都包含在此。
客户端与服务器端共有包:
- bean包:封装普通用户和管理员的各种属性信息。
- Message包:封装在服务器和客户端之间传输的各种信息类。
架构图
主要技术难点
1. 多个用户,多个功能都需要利用Socket得到输入输出流,但是如果公用一个Socket会导致Java.io.StreamCorruptedException: invalid stream header: 异常,程序无法运行
解决方法:
利用多线程,使得每一个登陆的用户都获得一个Socket,使得多用户的问题得到了解决。但随着继续编写功能,又出现了同样的问题。起初企图通过判断输入对象流中的对象类型判断,只用一个输入流来实现,但同样出现了问题。故采用多个Socket,每个功能的线程传入一个不同的Socket,进行通讯。虽然方法可能不是很好,但是问题得到了解决。
2. 线程的阻塞,程序卡住,按钮无响应,无异常提示
解决方法:
每一个功能都开启一个线程,将具体的功能实现加在线程的run()方法中。
3. 起初聊天界面采用JTextArea,JTextArea是纯文本的编辑框,无法完成含图片信息的发送
解决方法:
将JTextArea改为JTextPane,取得JTextPane的StyleDocument作为聊天内容存储到MessageForChat/MessageForGroupChat,再用相同的方法进行传输发送
4. 起初用String类型在数据库中存储聊天内容,但由于修改为可发送图片,聊天内容为对象,存储读取与String有很大差别。
解决方法:
数据库中的数据类型改为LONGBLOB,存储时,直接存入对象;读取时,利用BufferedInputStream和ObjectInputStream结合读取对象
5. 手绘面板的实现
解决方法:
手绘界面Draw implements MouseListener, MouseMotionListener监听器。按下鼠标时开始得到坐标,拖动时不断更新坐标,利用Graphics2D画笔画出轨迹即手绘线条,然后保存为图片发送给对方。
6. 实现文件下载后无法正常登录
解决方法:
在实现文件下载后,登录界面卡住。仔细检查是因为下载时,需要从客户端发送文件名到服务器,以便调用数据库得到该文件在服务器的存储地址。服务器端的输入流与登录信息的输入流冲突。后将接收文件名操作卸载服务器与文件下载相关的线程中进行,登录,文件下载功能都正常。
7. 管理员和普通用户的区分
解决方法:
考虑到如果管理员也有单独的管理员账号和密码,那么管理员部分需要重新架构,还需与普通用户保持一定联系,所以放弃这个办法。通过在登录时判断用户学号与系统设定的管理员账号是否匹配,如果匹配,则在主界面出现“管理员登录”按钮;如果不匹配,则不出现此按钮。