面向对象设计——网络聊天室

一、项目简介

功能描述:网络聊天室应用。实现了用户登录、注册、群聊、私聊等功能。

个人负责任务:聊天室客户端与服务器设计,多线程设计。

二、功能架构图

三、个人任务简述

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技术后改进。

文件传输的交互过于简单,应该让客户端主动选择是否接收。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值