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

2023-11-16

在这里插入图片描述

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

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

公聊

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

在这里插入图片描述
如上图所示,我们去掉了网络连接和客户端登录、注册等功能,直接进入聊天的流程:

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

私聊

在这里插入图片描述
如上图所示:

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

显示在线用户

在这里插入图片描述
如上图所示:

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

运行截图

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

公聊

客户B发公聊:

客户A收到信息:

服务器log:

私聊

客户B私发信息给A:

客户A收到的消息:

显示在线用户信息

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 如何让 PHP、符号链接和 __FILE__ 很好地协同工作?

    在本地主机上 我有以下目录结构 share www trunk wp content plugins otherfolders share www portfolio wp content symlink Where symlink是一个符
  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手

随机推荐

  • java中如何导入同一个包下其他类文件中的方法,举个例子

    在 Java 中 可以使用 import 关键字导入同一个包下的其他类文件中的方法 例如 假设在同一个包 com example 下有两个类 ClassA 和 ClassB 那么可以在 ClassB 中导入 ClassA 中的方法 代码如下
  • LeetCode:二叉树的遍历方式(13道经典题目)

    LeetCode 二叉树的遍历方式 13道经典题目 本文带来与二叉树的遍历方法有关的经典题目 主要实现是C 144 二叉树的前序遍历 94 二叉树的中序遍历 145 二叉树的后序遍历 102 二叉树的层序遍历 107 二叉树的层序遍历 II
  • 盒模型BFC渲染机制

    目录 一 BFC基本慨念 二 BFC渲染规则 三 如何创建BFC元素 一 BFC基本慨念 一个块格式化上下文 block formatting context 是Web页面的可视化CSS渲染出的一部分 它是块级盒布局出现的区域 也是浮动层元
  • Python爬虫(JS逆向) 抓取POCO图片/Json数据处理/保存本地详细案例

    文章目录 目录 文章目录 前言 一 分析页面 二 逆向过程 2 1 分析参数 2 2 sign code值 2 3 扣代码 三 请求数据 处理Json数据以及把图片保存到本地 3 1 引入库 3 2 生成时间戳和参数 3 3 发起请求 四
  • SVN使用步骤

    1 基本操作 2 提交之间看一下变更内容 3 显示日志 是查看所有提交的记录 4 撤销和恢复操作 撤销本地修改 或者点击提交的时候 还原 把修改的撤销掉 第二种情况 内容已经提交上去了 点击提交日志 进行操作 只是撤销了本地 接着还需要继续
  • JS姓名和手机号脱敏处理

    export const mixins 身份证脱敏 methods 身份证号脱敏 setCertNo certNo if certNo certNo length gt 10 var certNo certNo trim let cert1
  • 单片机学习,设置一个密码锁

    用矩形键盘和LCD1602设置一个单片机 这是做完后所有所需要的文件 模板 具体模板以及功能参考我之前发的文章 51单片机常用的一些模块 模块化编程 延时函数模块 delay 独立按键模块 key 数码管模块 Nixie LCD1602模块
  • 【论文精读】IGEV-MVS:Iterative Geometry Encoding Volume for Stereo Matching

    今天读的是发表于CVPR2023的文章 作者全部来自于华中科技大学 文章链接 Iterative Geometry Encoding Volume for Stereo Matching 项目地址 GitHub 目录 Abstract 1
  • C语言中的条件操作符和前置++、后置++的区别

    一 条件操作符 条件运算符 conditional operator 有时候也称为三元运算符 ternary operator 或者trinary operator 因为它是唯一需要 3 个操作数的运算符 exp1 exp2 exp3 条件
  • BZOJ4868 [Shoi2017]期末考试

    YY一下的话感觉代价关于最晚出分时间是一个单峰函数 三分最晚的出分时间 然后贪心一下算代价就行 如果A gt B就只用B就行了 要不然的话出分时间小于当前限制的都可以随便往后调直到到达限制 那么先尽量用A 调不到限制以内的再用B即可 inc
  • 提升Python代码性能的六个技巧

    文章目录 前言 为什么要写本文 1 代码性能检测 1 1 使用 timeit 库 1 2 使用 memory profiler 库 1 3 使用 line profiler 库 2 使用内置函数和库 3 使用内插字符串 f string 4
  • 关于 DEBUG到ps.executeUpdate();这一步不执行的问题

    20191008 今天下午在公司debug的时候 发现两个表的一直走到SQL执行那一层的时候不往下执行了 原因是这两个表我再用PLSQL进行查询的时候用了select from xxx for update语句 然后没有commit 导致表
  • Yii2安装与基本应用记录

    前面陆续实验了laravel和CI平台 安装部署与应用 今天咱们再尝试一下yii平台 听说yii平台可以通过程序配置后 自动生成功能代码 很值得启动 不说废话 走起 首先是安装 yii的安装比较简单 不需要很复杂的其它附带的东西 只需要Co
  • 删除链表元素详解版(Java)

    目录 题目 1 一般方法 2 虚拟头节点法 3 递归法 题目 Leetcode203题 移除链表元素 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node val val 的节点 并返回 新的头节点 1 一般
  • 大数据毕业设计题目分享 毕设开题选题

    文章目录 0 前言 1 如何选题 1 1 选题技巧 如何避坑 重中之重 1 2 为什么这么说呢 1 3 难度把控 1 4 题目名称 1 5 最后 2 大数据 选题推荐 2 1 大数据挖掘类 2 2 大数据处理 云计算 区块链 毕设选题 2
  • Anaconda清华镜像--安装、配置与使用

    文章目录 1 Anaconda下载安装 1 1 下载地址 1 2 安装 2 配置清华镜像源 3 测试使用 4 未找到的模块 1 Anaconda下载安装 1 1 下载地址 清华镜像 https mirrors tuna tsinghua e
  • 差异范围柱状图

    图形效果 在这里插入图片描述 数据 程序 setwd C Users Think Desktop 项目 相关R包载入 library ggplot2 library dplyr library cols4all library patchw
  • VS Code 安装方法

    1 安装控制台程序 NET SDK 功能 应用能够正常的运行和构建 NET SDK下载地址 下载 NET Linux macOS 和 Windows 2 安装驱动编辑器vscode vscode下载地址 https code visuals
  • 配置ssd为缓存_结合群辉420+的存储配置,聊聊NAS硬盘该如何选

    最近几年随着大家拍照 拍视频的需求越来越强 手机容量一直水涨船高 从几年前64G就算 海量存储 到现在 256G是主流 512G不嫌多 很多小伙伴都感叹因为视频需求 手机的存储容量永远不够用 大量的视频文件 也就意味着传统的文件管理系统也继
  • 从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4

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