文章目录

  • 项目描述
  • 相关技术
  • 项目功能
  • 项目实现
  • 整体思路
  • 具体实现
  • 服务器端
  • 客户端
  • 项目测试
  • 性能测试
  • 功能测试
  • 压力测试
  • 易用性测试
  • 容错性测试
  • 兼容性测试
  • 安全性测试
  • 项目扩展点


项目描述

Java微聊室是一个采用客户端/服务器端模式的聊天室,服务器采用线程池调度执行服务器与客户端业务逻辑处理,管理注册用户、发送数据、退出时注销用户;客户端在与服务器端建立连接后,通过Socket对象获取输入输出流从而与服务器端之间进行通信。采用读写线程,分别处理交互与服务器数据接收,输出服务器响应的数据。

相关技术

  • Java SE基础
  • 多线程
  • Socket编程

项目功能

  • 用户上线注册:启动程序,用户通过输入用户名和密码成功注册,若注册失败,返回错误信息
  • 私聊:用户A私聊用户B,假设B已注册,私聊消息会发送到B,消息内容仅A、B可见;若B没有注册则提示A没有此用户
  • 群聊:所有在线用户都可以收到群聊消息
  • 用户下线注销:用户退出,系统提示该用户下线

项目实现

整体思路

  • 模式:对于聊天室就是处理多个客户端发送的请求与信息,从而需要一个服务器端去处理这些客户端请求与信息,故采用的是服务器端/客户端模式。
  • 客户端与服务器端的连接:既然是多个客户端发送的请求与信息交给服务器端处理,那么客户端与服务器端之间需要进行连接,在我的博客:中介绍到两台计算机之间如何通过使用套接字建立TCP连接,从而进行通信操作。
  • 处理多线程问题:关于客户端,客户端需要向服务器端发送信息,而客户端也需要接收服务器端的信息,故需要两个线程分别处理客户端向服务器发送信息和客户端接收服务器端信息。关于服务器端,由于服务器端是统一处理多个客户端发送的信息请求,故每当有一个客户端与该服务器端建立连接后,需要创建新的线程去单独处理该客户端发送的信息。
  • 客户端方面:客户端在与服务器端建立连接后,通过Socket对象获取输入输出流从而与服务器端之间进行通信。
  • 服务器端方面:服务器端的套接字ServerSocket对象在调用accept()方法侦听客户端的连接,当与客户端成功建立连接后,返回Socket对象,从而利用该Socket对象获取输入输出流从而与客户端进行通信

具体实现

服务器端

在两个用户聊天时,并不是直接收发消息,而是通过服务器进行交互的,所以服务器和客户端之间就需要建立连接进行通信。客户端和服务器端之间其实是一个多对一的关系,同一时间可能会有多个客户端需要和服务器端建立连接进行通信,我们将一个客户端看做是一个线程,所以这是一个多线程的问题,相对于每次创建线程来说线程池非常方便,不仅提高了线程的响应速度和可管理性,还降低了资源的消耗。

下图是服务器端和客户端大致的交互过程:

java聊天室程增加功能 java聊天室项目描述_客户端


java聊天室程增加功能 java聊天室项目描述_项目_02


服务器端如何保存客户端注册用户的信息?由于每当有一个客户端与服务器端建立连接后,服务器端就需要将客户端保存起来以便在私聊群聊使用到每个客户端的信息,故选择全局的Map集合类的ConcurrentHashMap类将客户端信息保存起来,将客户端注册的用户名作为ConcurrentHashMap的key值,客户端的Socket对象作为ConcurrentHashMap的value值。为什么不使用HashMap或者HashTable呢?HashMap在多线程环境下会引起死循环,线程不安全,而HashTable为了保证线程安全,内部使用了synchronized同步方法,性能太低!!

客户端

对于客户端来说,只需要做两件事:向服务器端发送信息;接收服务器端信息
那么客户端实例化一个Socket对象获取输入输出流,将客户端连接到指定服务器和端口

项目测试

性能测试

  • 测试环境:Windows10操作系统
  • 处理器:Intel® Core™ i7-7500U CPU @2.70GHz 2.90GHz
  • 内存:8.00GB
  • 支持最大的用户在线数:线程池大小(默认为10)
  • 响应时间:大约0.3s

功能测试

java聊天室程增加功能 java聊天室项目描述_服务器端_03

压力测试

  • 当在线用户数达到最大时,继续注册新用户

易用性测试

  • 系统提示明确,易操作

容错性测试

  • 输入错误信息有正确提示
  • 输入错误信息系统不崩溃、不退出、不丢失数据

兼容性测试

  • 兼容Windows和Linux系统

安全性测试

  • 私聊消息内容仅私聊成员可见
  • 消息能正确发送
  • 自己发送群聊消息不会发给自己

项目扩展点

  • 数据存到数据库中,确保数据的持久性
  • 发送的敏感信息加密或者不发送
  • 可以发送图片等其他格式