# CU-基于IO多路复用的高并发即时通信系统 **Repository Path**: chi-sha/CU ## Basic Information - **Project Name**: CU-基于IO多路复用的高并发即时通信系统 - **Description**: CU基于Socket实现即时通信,使用I/O多路复用以及线程池等技术实现高并发;运行在Windows环境下,启动服务端后通过客户端即可实现私聊、群聊、离线留言以及文件收发等功能 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-13 - **Last Updated**: 2024-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # README # 项目简介 CU基于Socket实现即时通信,使用I/O多路复用以及线程池等技术实现高并发;启动服务端后通过客户端即可实现私聊、群聊、离线留言以及文件收发等功能 # 功能介绍 ## 1、用户登录/注册 ### 1.1、用户登录 1. 用户在客户端前端输入账号和密码,点击登录按钮,此时在前端通过正则表达式进行第一轮验证,过滤掉不符合要求的账号并提示 2. 客户端前端验证通过,将账号和密码封装进User对象 3. 客户端访问服务端监听的端口,通过socket连接,建立线程持有该socket,然后并将User对象发送给服务端 4. 服务端获得User对象,首先验证该User对象的账号是否在数据库中存在,存在则验证密码是否正确 - 验证通过,服务端创建一个线程,持有该socket对象,和客户端保持通信,将该线程放到线程池集中管理,然后返回Message对象告知客户端登录成功 - 验证不通过,服务端返回Message对象告知客户端登录失败,然后关闭该socket 5. 客户端接收到服务端消息,登录成功则进入用户列表界面,登录失败则给出相应提示 ### 1.2、用户注册 1. 用户在客户端前端输入账号和密码,点击注册按钮,此时在前端通过正则表达式进行第一轮验证,过滤掉不符合要求的账号并提示 2. 客户端前端验证通过,将账号和密码封装进User对象 3. 客户端访问服务端监听的端口,建立socket连接并将User对象发送给服务端 4. 服务端获得User对象,首先验证该User对象的账号是否在数据库中存在 - 不存在,服务端将User的账号密码存入数据库。同时创建一个线程,持有该socket对象,和客户端保持通信。将该线程放到线程池集中管理后返回Message对象告知客户端注册成功 - 验证不通过登录失败,服务端返回Message对象告知客户端注册失败,然后关闭该socket 5. 客户端接收到服务端消息,注册成功则进入用户列表界面,注册失败则给出相应提示 ## 2、系统无异常退出 - 客户端 1. 给服务端发送退出系统的消息 2. 移除持有socket的线程,关闭socket,退出系统 - 服务端 1. 根据客户端发送的消息,在线程池中找到持有与该客户端连接的socket的线程并关闭 2. 关闭对应socket,给出系统提示 ## 3、拉取在线用户列表 服务端记录一个`ConcurrentHashMap`,当用户登录时,将该用户的User对象put进去,当用户退出系统时,将该用户的User对象remove 客户端拿去在线用户列表时,遍历这个`ConcurrentHashMap`,返回对应的用户列表 ## 4、聊天 ### 4.1、私聊 1. 客户端发送消息对象给服务端,其中包含发送人、接收人以及消息内容 2. 服务端接收消息后根据接收人信息找到对应线程的socket,转发接收人 3. 接收人消息显示 ### 4.2、群聊 1. 客户端发送消息对象给服务端,其中包含发送人以及消息内容 2. 服务端接收消息后遍历在线用户列表,并转发该消息 3. 在线用户消息显示 服务器推送新闻/通知功能与群聊功能类似,发送消息给全部在线用户 ### 4.3、文件的收发 与私聊类似,不过Message对象需要添加`src`,`dest`属性,同时消息内容变为文件转化的字节数组 ### 4.4、离线留言和发送文件 发送消息/文件给离线用户时,该消息/文件会被存入数据库(离线留言数据表 >)。当接收者上线时,服务端会通过receiver_id取出对应的ArrayList并转发其中Message给该用户,转发成功之后会删除对应的数据