当前位置: 首页 > news >正文

开发业务(3)——swoole和聊天室入门开发

 在普通的PHP代码里面,我们不需要考虑性能和异步问题,包括不限于我们想要使用php搭建一个http服务器(在node/python/go里面都有http模块,但是PHP没有这种功能)。而同样的原因,很难实现php游戏的开发,需要webSocket长链接和异步相关处理。

  安装(win服务器上安装比较费劲,不建议win运行swoole),我们已经搭建了我们的后台服务器管理中心。直接到PHP扩展里面安装即可,如果想要手动安装,需要按照官方的命令去安装,服务器管理后台会自动帮我们配置好。



开始测试搭建一个swoole的http服务器(官方的demo)

然后直接使用php  demo.php挂起到服务器里面(如果要守护)

这样就表示我们搭建swoole实现成功。我们也可以在进程里面看下9501的端口,直接lsof | grep “9501” 可以看到当前进程在运行,这样就完成了一个简单的http服务器搭建。也就是swoole最简单的使用。

  

现在我们加深难度,我们要创造一个webSocket 并进行调试。同样我们使用官方的webSocket代码。

使用php  demo.php 直接跑起来,只要显示成功即表示我们的webSocket服务器成功链接。然后使用我们的APIFOX增加webSocket接口调试功能

发送一条消息,简单成功:

这样表示已经和服务器建立了链接。我们客户端不断发出请求,服务器可以很快速度响应,不用跟http协议一样反复断开和链接,效率大幅度提升。

Websocket通讯成功,API调试接口也成功,现在继续加深难度,我们搭建一个简单的多人聊天室,同时告知各个在线的情况。依旧很简单:

 多人聊天室最简单的情况:
// 创建一个 Swoole HTTP 服务器
$server = new Swoole\Websocket\Server("0.0.0.0", 9501);
// 监听 WebSocket 连接打开事件
$server->on('open', function (Swoole\Websocket\Server $server, $request) {echo "New connection: {$request->fd}\n";
});// 监听 WebSocket 消息事件
$server->on('message', function (Swoole\Websocket\Server $server, $frame) {echo "Received message: {$frame->data}\n";// 广播消息给所有客户端foreach ($server->connections as $fd) {$server->push($fd, $frame->fd.':'.$frame->data);}
});// 监听 WebSocket 连接关闭事件
$server->on('close', function ($server, $fd) {echo "Connection close: {$fd}\n";
});
echo  "聊天室启动";
// 启动服务器
$server->start();

对话聊天窗口

我们已经完成了一个最简单的群聊天逻辑,现在我们将系统继续复杂化,就是允许客户端定义自己的昵称,同时离开的时候,也要告诉其他人昵称谁来了,谁走了。(和我们WX群聊天已经有点类似)这个时候,我们需要定义参数:

// 创建一个 Swoole HTTP 服务器
$server = new Swoole\Websocket\Server("0.0.0.0", 9501);
$uid = 0 ;
$username = '' ;
$touid = 0 ;
$account = ['uid'=>$uid,'username'=>$username,'touid'=>$touid,'fd'=>0
];
// 监听 WebSocket 连接打开事件
$server->on('open', function (Swoole\Websocket\Server $server, $request)use (&$account) {$account['uid'] = $request->get['uid'];$account['username'] = $request->get['username'];$account['touid'] = $request->get['touid'];$account['fd'] =    $request->fd ;echo "New connection: { $request->fd}\n";foreach ($server->connections as $fd) {$server->push($fd,  $account['username']."来了");}
});// 监听 WebSocket 消息事件
$server->on('message', function (Swoole\Websocket\Server $server, $frame)use  (&$account) {// 广播消息给所有客户端foreach ($server->connections as $fd) {$server->push($fd, $account['username'].':'.$frame->data);}
});// 监听 WebSocket 连接关闭事件
$server->on('close', function ($server, $fd) use  (&$account){echo "Connection close: {$fd}\n";// 广播消息给所有客户端foreach ($server->connections as $fd) {$server->push($fd, $account['username'].'潇洒的离开了');}
});
echo  "聊天室启动";
// 启动服务器
$server->start(); 

加入的昵称已经实现:

小结: 简单的多人聊天室后端已经完成,前端使用的是API调试工具,已经可以看到来去昵称。掌握swoole 搭建http服务器,理解webSocket 搭建webSocket服务器,掌握APIfox调试WS协议的方法,完成基础的swoole用法,包括变量获取和交互。

相关文章:

开发业务(3)——swoole和聊天室入门开发

在普通的PHP代码里面,我们不需要考虑性能和异步问题,包括不限于我们想要使用php搭建一个http服务器(在node/python/go里面都有http模块,但是PHP没有这种功能)。而同样的原因,很难实现php游戏的开发&#xf…...

Linux系统服务——【web,http协议,apache服务和nginx服务】(sixteen day)

一、web基础以及http协议 1、web基本概念和常识 前端开发一般用uniapp. 1、Web:为用户提供的一种在互联网上浏览信息的服务,Web 服务是动态的、可交互的、跨平台的和图形化的。 2、Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务&#xf…...

100、Python 关于时间日期的一些操作

在Python中,我们用于处理时间和日期相关的类型最常用的模块是datetime模块。该模块提供了很多与时间日期相关的类,对我们处理时间日期变得很方便。 以下是一些常见的关于时间日期的操作。 一、datetime类 1、获取当前日期和时间(年、月、日…...

【精通Redis】Redis命令详解

引言 Redis是一个内存数据库,在学习它的内部原理与实现之前,我们首先要做到的就是学会使用,学会其丰富的命令操作。 一、字符串 Redis的字符串类型之前笔者的一篇入门介绍中曾经说过,不是简单的只存人可以阅读的字符串&#xf…...

项目经理的开源工具指南:优化您的选择过程

国内外主流的10款开源项目管理系统对比:PingCode、Worktile、禅道、Teambition、Gogs、码云 Gitee、Jira、Redmine、ProjectLibre、OpenProject。 在选择合适的开源项目管理系统时,很多团队面临诸多挑战:功能是否全面?易用性如何&…...

如何防御IP劫持

摘要 IP劫持是一种网络攻击方式,攻击者通过各种手段获取对某个IP地址的控制权,并将其用于恶意目的。这种攻击可能会导致数据泄露、服务中断等严重后果。本文将介绍IP劫持的基本概念、攻击方式以及防御策略,并提供一些实际的代码示例。 IP劫…...

C++绝对值

在C中&#xff0c;你可以使用标准库中的abs函数来获取一个整数的绝对值。对于浮点数&#xff0c;也有一个类似的函数叫做fabs。下面是如何使用这些函数的示例&#xff1a; 对于整数 对于整数&#xff0c;你可以使用std::abs函数&#xff0c;它存在于<cstdlib>头文件中。…...

C# dataGridView 去掉左边多出来空列

1.问题 在使用winform做界面程序时&#xff0c;dataGridView控件创建好后&#xff0c;左侧会多出一列为空&#xff0c;如何删除呢 2.解决方法 你可以在属性窗口中进行设置 如图&#xff1a; 将RowHeadersVisible 属性设置为False 或者代码设置 this.dataGridView1.RowHea…...

esp32

买了单片机模块&#xff0c;学8266...

IDEA 本地有jar包依赖文件,但是所有引用的jar包全部爆红

前端时间 看源码&#xff0c;下载源码额按钮不见了&#xff0c;折腾了很久&#xff0c;遂打算重新安装idea&#xff0c;但是重新安装后&#xff0c;发现代码全都爆红&#xff0c;按照晚上说的删除idea 文件夹&#xff0c;idea缓存删除&#xff0c;都不好使&#xff0c;但是看到…...

如何在调整节拍时间的过程中保持生产流程的稳定性?

在快节奏的工业生产领域&#xff0c;节拍时间&#xff08;Takt Time&#xff09;——即完成一个完整产品所需的标准时间&#xff0c;是维持生产效率和流程稳定性的关键指标。然而&#xff0c;市场需求的波动、技术升级或是生产线的微调&#xff0c;都可能要求我们对节拍时间进行…...

3. Docker的数据管理与持久化

在Docker容器化应用中&#xff0c;数据的持久化和管理是一个关键问题。容器的生命周期短暂&#xff0c;容器的停止和删除会导致数据丢失。因此&#xff0c;了解Docker的数据卷&#xff08;Volumes&#xff09;和挂载&#xff08;Mounts&#xff09;的管理方式&#xff0c;对保障…...

Logback原理及应用详解(九)

本系列文章简介&#xff1a; 在软件开发的过程中&#xff0c;日志记录是一项至关重要的功能。它不仅帮助开发者在开发阶段追踪代码的执行流程和调试问题&#xff0c;还在生产环境中扮演着监控应用运行状态、记录关键业务信息和排查故障的重要角色。随着软件系统的日益复杂和分布…...

SpringBoot 禁用RabbitMQ自启动

1.背景 在实际开发中,项目中使用了mq,但是在测试的时候用不到mq,或者测试环境的mq挂了, 希望能正常启动项目 2.步骤 这很简单在配置文件中增加一个配置就可以了 spring:autoconfigure:exclude: org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration 表示启…...

unity 实现图片的放大与缩小(根据鼠标位置拉伸放缩)

1创建UnityHelper.cs using UnityEngine.Events; using UnityEngine.EventSystems;public class UnityHelper {/// <summary>/// 简化向EventTrigger组件添加事件的操作。/// </summary>/// <param name"_eventTrigger">要添加事件监听的UI元素上…...

Scrapy 爬取旅游景点相关数据(五)

本期内容&#xff1a;&#xff08;1&#xff09;爬取日本其他城市数据存入数据库&#xff08;2&#xff09;爬取景点评论数据 1 爬取其他城市景点数据 只爬取一个城市的数据对于做数据可视化系统可能是不够的&#xff0c;因为数据样本量少嘛&#xff0c;本期来爬取其他城市的景…...

程序员纯粹八股文的危害有哪些,应该如何来解决?

“八股文”这个词在程序员面试的上下文中通常指的是那些被广泛讨论、反复练习的问题和答案&#xff0c;它们往往围绕着一些经典的技术知识点&#xff0c;例如算法、数据结构、设计模式等。这些知识在面试中被频繁提及&#xff0c;以至于应聘者经常会提前准备并背诵这些答案&…...

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…...

【前端 09】JavaScript中的对象与JSON

JavaScript中的对象与JSON 在JavaScript中&#xff0c;对象和JSON&#xff08;JavaScript Object Notation&#xff09;是两个紧密相连但又有区别的概念。它们都在数据处理和交换中扮演着重要角色。本文将详细讲解JavaScript中的自定义对象以及JSON对象的基本概念、格式、用法…...

C# 字符串罗马数字123转汉字一二三

要将字符串 "123" 转换为 "一二三"&#xff0c;可以通过以下几种方法来实现。 1. 使用映射字典 可以创建一个映射字典&#xff0c;将数字字符映射到对应的中文数字&#xff0c;然后遍历原始字符串进行替换&#xff1a; using System; using System.Coll…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...