前面文章链接如下:

从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 。

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

  1. 轻易实现基于linux或win运行的聊天服务端程序

    对于不了解网络编程的开发人员来说,编写一个良好的服务端通讯程序是一件比较麻烦的事情.然而通过EC这个免费组件你可以非常简单地构建一个基于linux或win部署运行的网络服务程序.这种便利性完全得益于m ...

  2. OpenFastPath(2):原生态Linux Socket应用如何移植到OpenFastPath上?

    版本信息: ODP(Open Data Plane): 1.19.0.2 OFP(Open Fast Path): 3.0.0 1.存在的问题 OpenFastPath作为一个开源的用户态TCP/IP ...

  3. 基于LINUX的多功能聊天室

    原文:基于LINUX的多功能聊天室 基于LINUX的多功能聊天室 其实这个项目在我电脑已经躺了多时,最初写完项目规划后,我就认认真真地去实现了它,后来拿着这个项目区参加了面试,同样面试官也拿这个项目来 ...

  4. 基于Linux的TCP网络聊天室

    1.实验项目名称:基于Linux的TCP网络聊天室 2.实验目的:通过TCP完成多用户群聊和私聊功能. 3.实验过程: 通过socket建立用户连接并传送用户输入的信息,分别来写客户端和服务器端,利用 ...

  5. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  6. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  7. Java进阶:基于TCP通信的网络实时聊天室

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  8. Linux Socket多线程实现简单的多人聊天(pend)

    Server: 设置可聊天数为5,为每一个client创建一个线程,这个线程负责接收client的聊天内容并发给其他用户看. 用mutex同步各个线程修改聊天室空余聊天位. Client: 主线程负责 ...

  9. 基于Linux C的socket抓包程序和Package分析 (一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guankle/article/details/27538031  測试执行平台:CentOS 6 ...

  10. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

随机推荐

  1. Golang基于Mysql分布式锁实现集群主备

    背景 集群中如果需要主备,可以基于Redis.zk的分布式锁等实现,本文将介绍如何利用Mysql分布式锁进行实现. 原理 数据库中包含数据字段(此处为Master的主机名).版本号和上一次更新时间. ...

  2. 用基础Array数组实现动态数组、链表、栈和队列

    代码地址: https://gitee.com/Tom-shushu/Algorithm-and-Data-Structure.git 一.ArrayList自定义封装 package com.zho ...

  3. MySQL自定义函数(User Define Function)开发实例——发送TCP/UDP消息

    开发背景 当数据库中某个字段的值改为特定值时,实时发送消息通知到其他系统. 实现思路 监控数据库中特定字段值的变化可以用数据库触发器实现.还需要实现一个自定义的函数,接收一个字符串参数,然后将这个字符 ...

  4. debian11 简单搭建go环境

    简单环境,目前仅支持单版本go,后续可以考虑直接把go环境放到docker中或podman中,这样每个容器都是一套go版本. 新建文件夹目录 # 我直接用的root账户 cd /root mkdir ...

  5. Docker的使用和常用命令

    部署项目前基础服务准备 第一步:安装Docker环境 第二步:开启Docker远程带证书访问(可选) 第三步:拉取mysql,redis,nginx等等所需镜像 第四步:运行(创建)容器 # 本地远程 ...

  6. Java核心字符串String进阶

    字符串对象 字符串是对象,不是简单数据类型 封装在java.lang包,自动导入 创建字符串对象 常见创建一个字符串对象有下面2个方法 String str=new String("chen ...

  7. PHP 程序员是学 Swoole ?还是学 Go ?

    大家好,我是码农先森. 面临现状 这次为什么要讨论这个话题,因为 Swoole 和 Go 在 PHP 程序员坊间一直都是茶语饭后的谈资,觉得懂 Swoole 和 Go 的就高人一等.相信有很多的 PH ...

  8. 使用post请求登陆

    1.使用post请求登陆 import requests import matplotlib.pyplot as plt url = 'https://www.ptpress.com.cn/login ...

  9. 使用libzip压缩文件和文件夹

    简单说说自己遇到的坑: 分清楚三个组件:zlib.minizip和libzip.zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主 ...

  10. 万维网WWW

    万维网是一个大规模的联机式信息储存场所,能方便地从一个网络站点访问另一个网络站点.万维网是一个分布式的超媒体系统. 统一资源定位符URL URL表示从互联网上得到的资源位置和访问这些资源的方法,实际上 ...