从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4

从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第1张图片

前面文章链接如下:
《从0实现基于Linux socket聊天室-多线程服务器模型-1》
《从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2》
《从0实现基于Linux socket聊天室-实现聊天室的登录、注册功能-3》

上文中,我们基于多线程的框架,实现了注册和登录的功能,这一章,我们在此基础上来实现公聊、私聊、显示在线用户列表功能。

公聊

接着上几篇的流程图我们详细讲解公聊流程图如下:

从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第2张图片
如上图所示,我们去掉了网络连接和客户端登录、注册等功能,直接进入聊天的流程:

  1. 客户端从菜单选择公聊功能;
  2. 输入要聊天信息;
  3. 回车发送聊天信息;
  4. 服务器的子线程收到公聊数据之后,进入公聊流程;
  5. 查找所有在线用户,向所有的在线用户发送该公聊信息;
  6. 客户端进入聊天后会创建一个子线程,该子线程会循环接收所有服务器发送的数据信息。

私聊

从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第3张图片
如上图所示:

  1. 客户端从菜单选择私聊功能;
  2. 输入要聊天的对象和聊天信息;
  3. 发送聊天信息给服务器;
  4. 服务器的子线程收到公聊数据之后,进入公聊流程;
  5. 查找所有在线用户,向所有的在线用户发送该公聊信息;
  6. 客户端子线程会循环接收所有服务器发送的数据信息。

显示在线用户

从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第4张图片
如上图所示:

  1. 客户端从菜单选择显示在线用户功能;
  2. 封装显示在线用户数据包,并发送该数据包给服务器;
  3. 服务器收到数据包后,进入显示在线用户功能模块;
  4. 检查在线用户数据信息数据库,将在线用户【fd不为-1】名称封装到数据包中,一次只填充一个,stat字段填充ONLINEUSER_OK;
  5. 所有用户发送完毕,补充一个数据包,stat填充ONLINEUSER_OVER;
  6. 收到服务器发送的在线用户数据包后,客户端子线程进入显示在线用户子模块;提取数据包中在线用户名字并打印,判断该数据包stat是否为 ONLINEUSER_OVER,如果不是则继续接收下一个数据包,如果是,则提示用户显示完毕。

运行截图

现在预设:
客户A:yikoulinux
客户B:yikoupeng

公聊

客户B发公聊:
从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第5张图片

客户A收到信息:
从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第6张图片

服务器log:
从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第7张图片

私聊

客户B私发信息给A:
从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第8张图片
客户A收到的消息:

从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第9张图片

显示在线用户信息

从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4_第10张图片

完整版代码
请自行下载:
链接:https://pan.baidu.com/s/1tVqJ59AUTkGBxuBBAVCsEQ
提取码:81v3

更多linux相关知识,请关注公众号 一口Linux 。

你可能感兴趣的:(linux系统应用,linux,并发编程,socket)