PHP 微信小程序 WebSocket MySQL Redis实现聊天功能

1.Mysql 实现离线消息池。如果一个用户不在线,则其他用户发送给他的消息暂时存储在mysql。待该用户上线时,再从离线消息池取出发送。

2.Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过用户账号 = fd 存到redis中。

微信小程序:

 

  

 websocket.php代码:

<?php
//创建WebSocket Server对象,监听0.0.0.0:9501端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);//连接Redis
$redis=new Redis();
$redis->connect('服务器地址',6379);//连接MySQL
$con=mysqli_connect("服务器地址","数据库名称","数据库密码","数据表名称"); //监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {});//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) use($redis) {$data=json_decode($frame->data,true);echo "{$frame->data}\n";print_r($data['me']);echo "\n";switch($data['type']){case 'open':echo "我:".$data['me'];echo "\n";//将登录者“我”的fd存入至Redis$redis->set($data['me'],$frame->fd);$me=$redis->get($data['me']);echo $me;echo "\n";//在数据库查询我离线时,别人给我发的消息$sql = "SELECT `me`,`content` from chats where `to` = '{$data['me']}' order by `add_time` asc";$result = mysqli_query($con,$sql);//如果有,展示出来,即把消息推给客户端,即推送给“我”if ($result) {$re = [];while($row = mysqli_fetch_assoc($result)) {array_push($re, $row);}mysqli_free_result($result);foreach ($re as $v) {$msg = ['msg' => $v['content']];$ws->push($frame->fd,json_encode($msg,true));}//推送给“我”之后,便将该消息删除处理$sql = "DELETE FROM chats where `to` = '{$data['me']}'";mysqli_query($con,$sql);}break;case 'chat':echo "给:".$data['to'];echo "\n";//从Redis中取出“当前好友”的fd$to=$redis->get($data['to']);echo "给的fd:".$to;echo "\n";            //所有在线的用户$fds = []; foreach($ws->connections as $fd){array_push($fds, $fd);}//判断“我”的“当前好友”是否在线if (in_array($to,$fds)) {$msg = ['msg' => $data['msg'],];//如果在线,直接推送要发送的消息$ws->push($to,json_encode($msg,256));} else {//如果不在线,将要发送的消息存入至数据表$add_time = date('Y-m-d H:i:s');$sql = "INSERT INTO chats(`to`,`me`,`content`,`add_time`) values ('{$data['to']}','{$data['me']}','{$data['msg']}','{$add_time}')";mysqli_query($con,$sql);}break;}
});//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {echo "client-{$fd} is closed\n";
});$ws->start();

MySQL表字段:

运行效果:

用户11给用户a发消息,用户a不在线: 

 

先把消息放置MySQL离线消息池: 

 

 用户a一上线,就看到用户11发来的消息:

并且数据表中的离线消息被删除:

 

 都在线后就可以正常实时对话了:

另外,补充:简单实现两人3分钟未聊天服务端连接断开的功能:

首先,定义一个方法,用setTimeOut:

然后,在连接上服务端后和每次给服务端发送完一个消息后调用一下这个方法 :

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/250942.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python实现简单的聊天小程序

概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服务端,使用socket进行消息的接受,每接受一个socket的请求,就开启一个新的线程来管理…

小程序即时聊天服务器wss,Socket/WS/WSS和小程序

Socket 通信 Socket 不属于网络协议范畴,而是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用。通过调用 Socket 使得程序员可以更方便地使用 TCP/IP 协议栈。 Socket 连接是长连接,理论上客户端和服务器端一旦建立连接将不会主…

用Python写一个模拟qq聊天小程序的代码实例

前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例&#xff0c;小编觉得内容挺不错的&#xff0c;现在分享给大家&#xff0c;具有很好的参考价值&#xff0c;需要的朋友一起跟随小编来看看吧 Python 超简单的聊天程序 客户端: 服务器: 模拟qq聊…

支付宝小程序平台的IM聊天插件

文章目录 前言一、用户端1.基本展示2.难处理的点二、另一用户端1.前端websocket的整合2.手机息屏websocket断线问题2.websocket服务端配置3.后端整合websocket作为服务端&#xff0c;传输消息给前端 总结 前言 最近工作需求来了个项目&#xff0c;前景为在支付宝平台上发布一个…

微信小程序——聊天小程序(从搭建到结束)

具体效果展示&#xff1a; 微信小程序——聊天功能&#xff08;一、环境搭建&#xff09; 微信小程序——聊天功能&#xff08;一、环境搭建&#xff09;_星^0^星的博客-CSDN博客 微信小程序——聊天功能&#xff08;二、账号的注册与登录&#xff09; 微信聊天小程序——&a…

Java-多人聊天小程序

上图啦&#xff01;&#xff01;&#xff01; 首先运行&#xff1a; Server.java 然后启动&#xff1a; Client.java 最后退出客户端&#xff1a; 代码实现 Client package chat;import javax.swing.*;public class Client {public static void main(String[] args) {// 使用…

7步搞懂手写数字识别Mnist

大家好啊&#xff0c;我是董董灿。 图像识别有很多入门项目&#xff0c;其中Mnist 手写数字识别绝对是最受欢迎的。 该项目以数据集小、神经网络简单、任务简单为优势&#xff0c;并且集合了CNN网络中该有的东西&#xff0c;可谓麻雀虽小&#xff0c;五脏俱全。 非常适合新手…

二开项目权限应用全流程-按钮级控制

二开项目权限应用全流程-按钮级控制 员工A和员工B都可以访问同一个页面&#xff08;以员工管理为例&#xff09;&#xff0c;但是员工A可以导出excel&#xff0c;员工B就不可以导出excel(看不到按钮) 思路 用户登陆成功后&#xff0c;用户可以访问的按钮级别权限保存在point…

VISIO使用技巧汇总

0.连接线拐弯或者连接不合适 0-0.Goal ​​​​​​​ 0-1. Automatic connection 0-3.Resolvent 0-3-0.ALTF9选项&#xff0c;取消粘附位置调整 0-3-1.选中线段-选中中心点-shift增加直角调整合适位置

Microsoft Visio 直线连接线

Microsoft Visio 直线连接线 1. 连接线 2. 直线连接线 3. 直线连接线图 References https://yongqiang.blog.csdn.net/

visio画太极图

步骤一 添加两个圆&#xff0c;且大圆的半径是小圆的2倍。 步骤二 往小圆添加一条直线作为直径 步骤三 选中小圆和直径,依次点击开发工具–操作–连接&#xff0c;然后选中连接后的小圆&#xff0c;再依次点击开发工具–操作–修建&#xff0c;可以分离出如下所示的两个…

visio 2007 画直线和矩形

visio 2007 画直线和矩形 1.问题描述 在一些图形中如果直接用连接线&#xff0c;会直接连到一些不理想的位置&#xff0c;而2007中不像2013及其以后那些版本中&#xff0c;有侧边栏能够直接画直线。 2.解决方式 直接选择工具栏中的红圈中的图标 能够生成红圈中的工具栏 然…

Visio对mysql怎么画er图_怎么用Visio画ER图

展开全部 画法如下&#xff1a; 1、由于Visio 2003默认的绘图模板并没有32313133353236313431303231363533e4b893e5b19e31333339653661E-R图这一项&#xff0c;但是画E-R图必须的基本图形Visio 2003还是有的&#xff0c;所以就得先把必要的图形添加到“我的模板”。以添加椭圆和…

Visio2010中设置线为直线

Visio2010中设置线为直线 在Visio2010中默认的线不是直线而是曲线&#xff0c;在画图中需要使用直线时要进行设置&#xff0c;下面介绍Visio2010中设置直线的方法。 1、打开Visio2010&#xff0c;然后点击设计&#xff1a; 2、点击调整大小下面的三角&#xff1a; 3、进入页面…

visio绘制流程图连接线总拐弯

描述 如图所示绘制流程图的连接线总拐弯 很让我强迫症发作 可以看到垂直的连接线总是会自动拐个弯 相关技巧 有说连接线中间点可以控制和增加中间点 或者按住shift 进行调整 这个还没研究明白咋操作不过没解决本质问题 此外还可以右键修改连接线属性 还可以在设计中进行调…

visio插入箭头_visio流程图中画箭头

visio流程图中画箭头 随着社会和经济的发展,电脑visio 2019软件已经成为我们生活中必不可少的一部分。visio 2019软件常常被我们使用于流程图的制作,很多第一次接触的朋友们不知道怎么在visio 2019软件制作流程图,接下来就让小编来教你们吧。 具体如下: 1. 第一步,打开电脑…

visio绘图小技巧

1.如何在图框的任意位置添加点&#xff1f; 先选中x点指令&#xff0c;再按住ctrl键&#xff0c;即可在任意位置画点 2.如何画出锯齿形线段&#xff1f; visio里面好像没有现成的锯齿形线段&#xff0c;所以可以利用直线反复折画&#xff0c;但是这里有个小技巧&#xff0c;就…

Visio简单画图使用方法

Visio使用方法 相信有很多初学者跟我一样&#xff0c;只会使用Word进行简单的画图。本章主要讲述如何使用Visio来画图&#xff08;版本为2010&#xff09; 一、系统流程图、数据流程图、ER图画法 1.打开Visio软件&#xff0c;创建简单模板 2.根据需求点击左侧"基本流程…

设计模式之~外观模式

定义&#xff1a; 为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 结构图&#xff1a; 区分中介模式&#xff1a; 门面模式对外提供一个接口 中介模式对内提供一个接口 优点&#xff1a; 松耦…

【xv6操作系统】安装、运行与调试

一、构建、装入过程 1.编写“启动代码主体代码”&#xff08;在下载的xv6的原始代码上进行修改&#xff09; 2.源代码进行编译、链接生成系统镜像&#xff08;elf格式的目标文件&#xff09; 3.将系统镜像保存起来&#xff08;如保存到磁盘、flash或者网络服务器上&#xff…