文件传输(简易版shell寻找文件,分群组和私聊文件传输):可以向好友发送指定文件。用户选择查看文件传输功能后,提示输入用户想要发送文件的另一个用户名,用户输入后,提示用户想要发送文件的文件名称,输入文件名后即可发送。接受方收到文件后,会将此文件保存在特定的文件夹中。服务端消息和文件传输缓存机制:缓存好友和群组发送的离线文件和消息,待该用户登陆后由服务器返回历史消息。

开发工具及运行环境概述

开发工具:Clion2020.1	运行环境:deepin15.11 Desktop	编译环境:gcc( Debian 6.3.0-18+deb9u1)6.3.0 20170516	编译文件:makefile
注册
【1】client端输入用户名和密码 -> 存于消息结构体mess中-> 将结构体发送给server端。
【2】server端接收client发送的结构体 -> 打开存储用户名密码的文件(server/data/user.txt) -> 验证文件中是否已存在该信息 -> 若无,将用户信息存入文件 ->返回注册消息(已存在该用户,重新注册||注册成功)。
2.2登录
【1】client端输入用户名和密码 -> 存于结构体中 -> 将结构体发送给server端。
【2】server端接收client发送的结构体 -> 打开存储用户名密码的文件(server/data/user.txt) -> 读取文件验证用户信息。
【3】server端匹配正确发送“登陆成功!”消息,匹配失败根据输入的内容判定提示(“密码错误!”、“用户名不存在,请注册新用户”、“用户已登录,请勿重复登录”)消息 -> client端接收,“登陆成功!”则进入功能菜单,其余则继续循环注册登录的菜单。
【4】若验证成功,server端产生一个新的套接字newfd,将它与用户名封装于同一个结构体中,存储在线用户的信息。将用户信息存入链表中,表示为在线用户。
消息、存储在线用户信息结构体:
Client Server消息结构体 (all.h)
私聊
【1】client端后台发送好友列表请求信息 -> 存于结构体中 -> 将结构体发送给server端。
【2】server端接收client发送的结构体 -> 打开存储用户好友信息的文件(server/data/friends/用户名.txt) -> 读取文件返回好友信息。
【3】client端接收server发送的结构体 -> 分离线程处理打印传输回来的好友信息。
【4】client端将发送好友对象和消息内容-> 存入发送的结构体中 -> 将结构体发送给server端。
【5】server端接收client发送的结构体 -> 根据接收者名字在online的链表中查找套接字描述符(若不在线将消息和日志信息存入服务端,待接受者登陆后将消息转发) -> 将消息发送给该接收者client端。
【6】client端接收server发送的结构体 -> 分离线程处理打印传输回来的好友消息。
群聊
【1】client端后台发送群组列表请求信息 -> 存于结构体中 -> 将结构体发送给server端。
【2】server端接收client发送的结构体 -> 打开存储用户群组信息的文件遍历查找该用户所在的群组(server/data/groups/group*.txt)-> 返回群组信息。
【3】client端接收server发送的结构体 -> 分离线程处理打印传输回来的群组信息。
【4】client端将发送群组对象和消息内容-> 存入发送的结构体中 -> 将结构体发送给server端。
【5】server端接收client发送的结构体 -> 根据群组所有接收者名字在online的链表中查找套接字描述符(若不在线将消息和日志信息存入服务端,待接受者登陆后将消息转发) -> 将消息存入消息结构体发送给该接收者client端。
【6】client端接收server发送的结构体 -> 分离线程处理打印传输回来的群组消息。
聊天记录查询
【1】client端选择文件传输对象的类型(friend||group),后台发送所选类型列表请求信息 -> 存于结构体中 -> 将结构体发送给server端。
【2】server端接收client发送的结构体 -> 打开存储用户群组(好友)信息的文件遍历查找该用户所在的群组(好友)(server/data/groups/group*.txt||server/friends/用户名.txt)-> 返回群组||好友信息。
【3】client端接收server发送的结构体 -> 分离线程处理打印传输回来的群组||好友信息。
【4】client端将查询对象(群组||好友)-> 存入发送的结构体中 -> 将结构体发送给server端。
【5】server端接收client发送的结构体 -> 根据查询对象读取server端的消息记录文件(server/records/groupchat/group*.txt|| server/records/ privatechat /用户1_用户2(根据字符串大小排序).txt) -> 将文件内容存入消息结构体发送给该接收者client端。
【6】client端接收server发送的结构体 -> 分离线程处理打印(保存)传输回来的群组消息(文件)。
文件传输
【1】client端选择文件传输对象的类型(friend||group),后台发送所选类型列表请求信息 -> 存于结构体中 -> 将结构体发送给server端。
【2】server端接收client发送的结构体 -> 打开存储用户群组(好友)信息的文件遍历查找该用户所在的群组(好友)(server/data/groups/group*.txt||server/data/friends/用户名.txt)-> 返回群组||好友信息。
【3】client端接收server发送的结构体 -> 分离线程处理打印传输回来的群组||好友信息。
【4】client端将发送对象(群组||好友),简易shell读取发送文件的路径和内容 -> 存入发送的结构体中 -> 将结构体发送给server端。
【5】server端接收client发送的结构体 -> 根据群组所有接收者名字(好友的名字)在online的链表中查找套接字描述符(若不在线将消息和日志信息存入服务端,待接受者登陆后将消息转发) -> 将消息发送给该接收者client端。
【6】client端接收server发送的结构体 -> 分离线程处理打印(保存)传输回来的群组消息(文件:保存在特定的文件夹中)。

系统设计流程图

系统使用方法

makefile编译
运行-注册-登录
私聊
群聊
文件传输(私聊&群聊)
在线人员
好友&群组聊天记录查询
Sever端离线缓存机制

代码

代码较多,感兴趣的同学可以点击链接下载(https://download.csdn.net/download/lzj_feifei/12575318)。

参考网站和不足