一、项目简介
功能描述:网络聊天室应用。实现了用户登录、注册、群聊、私聊等功能。
个人负责任务:聊天室客户端与服务器设计,多线程设计。
二、功能架构图
三、个人任务简述
1. 完成的任务与功能:
简单描述将自己完成的有特色的地方、重难点地方。
序号 | 完成功能与任务 | 描述 |
1 | 客户端之间的群聊与私聊 | 使用Client与服务端建立连接,完成客户端登录,实现消息的群聊,私聊。 |
2 | 在线人数的实时处理 | 实时显示在线人数,实时显示刷新在线人物列表,上下线提醒。 |
3 | 客户端文件与消息传输 | 利用 Java 对象的序列化,把消息类进行统一为 Message 类,然后用对象输入输出流在客户端和服务器之间传输。 |
4 | 服务端检验登陆信息 | 检验登陆时信息是否合法 |
四、本人负责功能详解
0.综述
客户端:Client类模块,ClientUI界面模块,ClientMsgType消息处理模块
服务器:Server类模块,ServerHandler模块,ServerMsgType消息处理模块
公共类:Message消息结构类,Common公共函数类,Config系统配置类
1.Client类模块
与服务端建立连接,完成客户端登录,实现消息的群聊,私聊,用户列表更新,文件转换等功能。是关键模块,通过服务器IP地址与端口建立连接。客户端有套接字和输入输出流。首先输入用户名,然后包装成Message对象发送给服务器,之后进入主循环对来自服务器的消息进行处理。
启动Client,并以对象流输入socket传来的消息。
多线程部分。写了一个简单的IDE用于显示消息。
发送消息。
各种关闭。
2.ClientUI界面模块
客户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,消息类型,在线人数等视图信息。定义了用户界面,所有的界面元素及相关的操作都在里面定义了方法,不论UI界面如何改变都不会影响到外部类。里面含有各种控件极其功能定义,还包括文件传输。
这部分主要由netbeans自动生成,且后期由其他同学进行了修改以适应整体,故略去不表。
3.ClientMsgType消息处理模块
定义了常用的消息处理方法。利用字节数组可以处理所有文件。
展示在线人数
消息公开发送与提示
文件发送的IDE
上下线与登录的提示。
4.Server类模块
启动监听,与客户端建立连接。创建ServerSocket,在指定端口监听,当有用户登录,接受套接字输入流,显示其登录信息,调用ServerHandler线程进行管理。
5.ServerHandler模块
提供线程管理,实现多用户的管理。针对每一个用户发过来的消息,进行相应处理,再转发给客户。服务端的核心,其中包含客户端线程连接类,套接字及输入输出流的初始化。每个新连接的客户端被初始化为一个ServerHandler对象线程,首先进行的是客户端登陆合法化检验,通过后将客户端添加到服务器线程池并通知所有在线用户。之后采用一个无限循环来和该客户端进行双向通信。
ArrayList<ServerHandler> clientList 把用户线程放入对象数组,HashMap把用户名和连接线程关联便于查找。接下来是ServerHandler的初始化。
用户经过登录校验后加入客户端线程,并提示上线。类似的有下线。
用户登录校验
客户端线程的操作
sendToClient发送消息给指定用户线程。
sendAllClient消息广播,把msg消息发送给每一个用户。其中clientList是ServerHandler的客户端容器类型,可以指向每一个用户。clientMap 是用户名到线程的映射。
sendClientList更新用户列表,当有新用户上线时,对以前的用户的好友列表,加上这个新用户名字,对于这个新用户,加上所有用户的名字。通过将消息包装成Message对象进行数据交互。
6.ServerMsgType消息处理模块
对客户端发送的消息进行指定操作模式处理,只进行消息转发,涉及一对多和一对一两种模式。定义了服务端对客户端发送消息的处理方式。消息包装成Message类,经过序列化后在服务器和客户端间传输。服务端根据消息的收发对象和类型进行转发。这里利用到Java的反射机制,根据消息类型获取相应处理函数。
处理消息如果用判断消息类型实现,则条件判断的分支太多,并且不利于内容的扩充和维护,故使用反射。
Method method = this.getClass().getDeclaredMethod(msg.getType());
运用method 类中的getDeclaredMethod获取Message的getType()方法返回的类型名
method.invoke(this);
利用invote直接调用此类型名对应的方法
try...catch的surrounding部分是处理失败时的默认对策,默认为chat。
下面是发送消息给指定的人功能与上下线登录功能。
7. Message消息结构类
客户端和服务器传输的消息被定义为类,通过对Message对象的序列化传输。底层数据封装的核心。所有的消息全部通过封装成Message从而在服务器和客户端之间收发。
因为要实现序列化传输所以实现了Serializable接口,定义了Serializable。
Message的各种构造器
Message实现了Cloneable接口,以及展示Message的方法。
8. Common公共函数类
提供文件序列化的处理以及常用的功能性函数。定义了文件处理相关的函数,这里我们把文件作为字节数组处理,这样实现了文件的透明化传输。
以下是字节数组转文件,文件转字节数组,复制指定文件到目标文件,文件转字符流,字符流转文件的方法。
9. Config系统配置类
包含连接IP及端口号的配置信息。实现了自动配置IP。
端口号是随意设置的。
自动配置IP利用了NetworkInterface类先获取了分配给此接口的IP地址列表组成的网络接口,在通过合适的网络接口去寻找其对应的IP地址。也就是说通过枚举本机的所有IP地址来获取本机IP。
五、课程设计感想
1.多线程、网络以及反射的java技术博大精深,我通过查询jdk、查阅博客、询问前辈等方式勉强完成了这次课设,今后还将继续深入钻研这些高级java技术,争取做到得心应手的应用。
2.java不只是java。这次课设除了java本身的知识外我还初步运用了计算机网络的知识,在小组讨论中也运用到了数据库的知识。今后要更加注意学科互通。
六、展望
自己所完成功能的不足之处及以后想要采取的改进方法。
客户端和服务器之间消息传输的安全性检验没有涉及,今后进一步了解JavaWeb技术后改进。
文件传输的交互过于简单,应该让客户端主动选择是否接收。