目录
1 项目简介
一款支持注册、私聊、群聊、退出功能的网络聊天室
2 项目功能
项目主要包含以下主要功能点:
- 注册:用户启动程序,通过填写用户名、密码注册账号。注册成功,提示“注册成功”;注册失败,返回错误信息。
- 私聊:注册成功的用户,可以私聊其他在线用户。
- 群聊:在线用户可以进行群聊,所有在线用户都能收到群聊消息。
- 退出:用户下线,服务端提示该用户下线。
2 相关技术
- Java基础
- Socket编程
- 多线程
3 实现思路
我们每天都接触大量的聊天软件(QQ、微信等),那么在使用之后,我们自己也可以DIY一个简便的聊天工具。于是就有了“微聊”。下面我将谈谈具体思路。
当我们(客户端)在使用聊天软件通信时,并不是直接发送消息给对方(或直接接收对方发来的消息)而是通过服务器进行交互的。服务器负责处理通信双方的具体业务。那么如何实现客户端与服务端的通信呢?这时候就想到了依靠套接字编程来实现。
服务端建立ServerSocket类的一个实例,客户端建立一个Socket类的实例。双方进行通信。。。
在一系列创建套接字、等待连接等操作后,服务端与客户端就可以开始通信。它们之间可以互相接收和发送数据。但,我们现在还只是完成了一部分。要想实现一个网络聊天室,我们必须实现让客户端和客户端之间能互相通信。这就意味着我们的服务器端现在必须实现下面两点:
- 同一时间可能要处理多个客户端的业务。
- 服务端要能让多个客户端之间相互通信(即服务端要让客户端之间能相互发送和接收数据),这样就能实现我们的私聊和群聊功能啦!
那么具体如何实现呢?
我们可以在服务端抽象出一个类(业务类),专门处理客户端的业务。因为同一时间可能会有多个客户端在跟服务端请求业务,这时就想到了多线程。我们可以构造多个线程来处理业务,当客户端请求业务的时候,专门有线程处理该客户端的业务,不影响其他客户端。我们都知道创建多线程有三种方式,但这里我并没有手动创建多个线程,而是采用的是线程池,主要原因是:
- 提高线程的可管理性:使用线程池可以统一进行线程分配、调度与监控;
- 提高响应速度:当新任务到达时,任务不需要等待线程创建就可以立即执行;
- 降低资源消耗:通过重复利用已经创建好的线程降低线程创建与销毁带来的损耗。
在线程池创建好后,就要想到要将每个客户端对应的Socket存放到哪里呢?首先想到的是HashMap,因为客户端注册的时候是要输入用户名的,所以让客户端名为Key,该 客户端对应的Socket为Value。在敲完代码之后,运行程序发现程序出现了死循环((⊙o⊙)…what?),查资料,查资料,哦!想起来了,HashMap在多线程环境下进行put操作会引起死循环,所以线程不安全,怪不得呢,那就用HashTable吧,线程安全。赶紧改代码,...改完了,走起!程序运行起来效率好低啊,怎么肥四?嗯,看代码发现,HashTable为了保证线程安全,内部使用synchronized同步方法,这样做相当于把整个哈希表上锁,锁粒度太粗,性能很低。怎么办?还好,ConcurrentHashMap出场了,ConcurrentHashMap内部采用锁分段技术保证线程安全,提高效率。完美!
到这里服务端就能同时处理多个客户端的业务了。那么下一步如何让客户端与客户端之间通信呢?假设A客户端想给B客户端发送消息,我们可以先让服务端接收A客户端的发来的消息,服务端再将消息转发给B客户端。因为A和B是不能直接通信的,这样就让他俩能通信了,相当于服务端提供一个转发数据的能力。而服务端处理数据的功能就可以交由它抽象出来的业务类实现了,再次就不一一赘述了。
整理好这些思路后,下面就是实现具体的细节上的东西了(敲代码ing...)
最后项目的整个编码工作就做完了。下面对项目进行测试。
4 使用教程
1. 下载程序发布的jar包,分别是
myChatRoom-server-1.0.0.jar
myChatRoom-client-1.0.0.jar
2. 在Windows命令行运行jar包(这里要注意:要先启动服务端)
java -jar myChatRoom-server-1.0.0.jar
java -jar myChatRoom-client-1.0.0.jar
出现以下提示:
3.下一步,客户端就可以根据提示信息注册了
客户端Jack注册:
服务端显示连接上的客户端的IP以及端口号信息:
4.客户端可以互相通信了
Rose给Jack发消息:
Jack接收到Rose发来的消息:
5.除此之外,客户端也可以按照帮助文档进行群聊,这里就省略了。
5 项目测试报告
5.1 测试用例
5.2 测试环境
软件环境 | 操作系统:Windows10、Linux(Centos7) |
硬件环境 | PC机1台,处理器:Intel(R) Core(TM) i5-7200U CPU @2.50GHz 2.71GHz;内存4.0GB |
5.3 测试结论
5.3.1 功能测试
测试目标:确保系统的功能正常,其中包括注册、私聊、群聊等功能。
测试方法:手工黑盒测试
测试过程依照测试用例,在这里只简单描述。
注册:用户名和密码格式正确,注册成功;用户名和密码格式不正确,提示错误信息(该功能正常)
私聊:私聊对象格式正确,发送的消息长度在允许范围内,私聊成功;否则,提示错误信息(该功能正常)
群聊:群聊消息长度在允许范围内,群聊成功;否则,提示错误信息(该功能正常)
退出:客户端关闭,程序正常退出(该功能正常)
5.3.2 性能测试
线程池大小默认为10(该值可在程序内自行设置),即支持客户端最大并发数为10个。
1.响应时间:不超过0.4s;
2.支持最大在线用户数:线程池大小为最大在线用户数
3.压力测试:
当在线用户数达到最大时,继续注册新用户。程序输出异常
bug修复:当在线用户数达到最大时,停止注册新用户,直到有其他用户下线。
5.3.3 安全性
- 所有的密码不明码显示、存储与传输;
- 有密码设置策略,包括最小长度、非空设置、大小写敏感;
- 预防SQL注入;
5.3.4 可靠性
成熟性 | 随机选择输入,能够处理系统失效的数据 | |||
容错性 |
|
5.3.5 易用性
- 提示信息直观、友好;
- 系统易操作;
5.3.6 兼容性
系统兼容 Windows10、Linux(Centos7)