Ratchet实现PHP WebSocket多人聊天功能的示例
- composer 安装ratchet
composer require cboden/ratchet
- 使用PDO连接数据库,创建mysql命令如下
CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY,message TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
- 使用Redis存储消息列表
这个示例代码中,PHP代码使用Ratchet来创建WebSocket服务器,并实现了简单的聊天功能。HTML代码使用JavaScript来建立WebSocket连接,并处理消息传输和用户输入。要运行此代码,请确保已安装Ratchet并在终端中运行PHP文件。然后,通过打开浏览器并访问HTML代码所在的地址,就可以开始聊天了。
在
onMessage
方法中,我们首先将接收到的消息存入Redis列表中。然后,如果Redis中的消息数量超过1000,则将所有消息取出并依次存入MySQL中。请注意,在MySQL中执行多个INSERT语句时,最好使用事务(即BEGIN、COMMIT语句)来确保数据的完整性。
WebSocket服务端代码:
<?phpuse Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;require_once __DIR__ . '/vendor/autoload.php';class Chat implements MessageComponentInterface
{protected $clients;protected $pdo;protected $redis;public function __construct(){$this->clients = new \SplObjectStorage;// 连接到数据库$dsn = 'mysql:host=localhost;dbname=chat';$username = 'root';$password = '';$options = [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC];$this->pdo = new \PDO($dsn, $username, $password, $options);// 连接到 Redis$this->redis = new \Redis();$this->redis->connect('localhost', 6379);}public function onOpen(ConnectionInterface $conn){$this->clients->attach($conn);echo "New connection! ({$conn->resourceId})\n";}public function onMessage(ConnectionInterface $from, $msg){foreach ($this->clients as $client) {if ($from !== $client) {$client->send($msg);}}// 将消息存入 Redis$this->redis->rpush('messages', $msg);// 如果 Redis 中的消息数量超过 1000,则将消息存入数据库if ($this->redis->llen('messages') > 1000) {$messages = $this->redis->lrange('messages', 0, -1);// 开始事务$this->pdo->beginTransaction();foreach ($messages as $message) {// 将消息存入数据库$stmt = $this->pdo->prepare('INSERT INTO messages (message) VALUES (?)');$stmt->execute([$message]);// 从 Redis 中删除已经存入数据库的消息$this->redis->lpop('messages');}// 提交事务$this->pdo->commit();}}public function onClose(ConnectionInterface $conn){$this->clients->detach($conn);echo "Connection {$conn->resourceId} has disconnected\n";}public function onError(ConnectionInterface $conn, \Exception $e){echo "An error has occurred: {$e->getMessage()}\n";$conn->close();}
}$webSocketServer = new \Ratchet\WebSocket\WsServer(new Chat());
$server = \Ratchet\Server\IoServer::factory(new \Ratchet\Http\HttpServer($webSocketServer),8080
);$server->run();
开启socket服务命令,假设php文件名为socket.php
php ./socket.php
HTML代码:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>WebSocket Chat</title>
</head>
<body><div id="messages"></div><form><input type="text" id="message" placeholder="Enter message"><button type="submit">Send</button></form><script>var conn;var connect = function() {conn = new WebSocket('ws://localhost:8080');conn.onopen = function(e) {console.log("Connection established!");};conn.onmessage = function(e) {var messages = document.getElementById("messages");var message = document.createElement("div");message.innerHTML = e.data;messages.appendChild(message);};conn.onclose = function(e) {console.log("Connection closed, attempting to reconnect...");setTimeout(connect, 1000);};};connect();var form = document.querySelector("form");var input = document.querySelector("#message");form.addEventListener("submit", function(e) {e.preventDefault();conn.send(input.value);input.value = "";});</script>
</body>
</html>
保证WebSocket服务一直开启,可以使用一个常驻进程管理工具supervisor,使用supervisor的示例配置链接。
Ratchet实现PHP WebSocket多人聊天功能的示例相关推荐
- 苹果禁用FaceTime多人聊天功能:漏洞将很快修复
[TechWeb]1月30日消息,据国外媒体报道,苹果在FaceTime上禁用了一项多人聊天功能,此前有用户表示,FaceTime存在一个漏洞可能会让通话者远程激活另一个人的麦克风. 这个漏洞使得Fa ...
- udp实现简单的多人聊天功能
udp实现简单的多人聊天功能 多个客户端向服务器发送信息,服务端再将信息返回到各个客户端. 这是接收udp的实现类: public class Rec implements Runnable{priv ...
- 【SpringBoot框架篇】18.使用Netty加websocket实现在线聊天功能
文章目录 1.简介 2.最终功能实现的效果图 2.1.pc端 2.2.移动端 3.实战应用 3.1.引入依赖 3.2.配置文件 3.3.测试demo 3.3.1.消息内容实体类 3.3.2.处理请求的 ...
- python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...
前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...
- Netty框架多人聊天案例,代码示例
Netty框架多人聊天案例,代码示例 pom <?xml version="1.0" encoding="UTF-8"?> <project ...
- WebSocket实现简单聊天功能案例
简介 1.使用WebSocket实现的一个简单的聊天功能业务 2.使用了SpringBoot的ApplicationEvent事件监听用来与业务解耦 3.需要注意的是websocket的长连接默认会在 ...
- JavaWeb--使用Websocket实现在线聊天功能
首先简单介绍下WebSocket,WebSocket是HTML5中内容,是基于TCP的一种新的网络协议,它支持全双工.长连接的通信.在它出现之前,实时消息发送与接收通过轮询实现,但是频繁与服务器建立连 ...
- 微信小程序 | 基于小程序+Java+WebSocket实现实时聊天功能
一.文章前言 此文主要实现在小程序内聊天对话功能,使用Java作为后端语言进行支持,界面友好,开发简单. 二.开发流程及工具准备 2.1.注册微信公众平台账号. 2.2.下载安装IntelliJ ID ...
- JSP使用Websocket技术实现聊天功能--H5网页前端部分(二)
[注]:使用的是LayUI作为前端框架,实现网页聊天功能,部分包可能出现版本更迭无法使用 前端页面 <%--Created by IntelliJ IDEA.User: ZhuDiDate: 2 ...
最新文章
- 【廖雪峰python入门笔记】字符串_转义字符的使用
- C++中无符号数与有符号数的转换
- java结构化语言,如何让Java代码流畅和结构化
- python lua 性能比较 内存_Lua 的速度为什么比 Python 快?
- BZOJ1014: [JSOI2008]火星人prefix
- 嵌入式常见笔试题总结(6)
- dockerfile拉取python3.7镜像
- bootstrap下拉框分页_【Bootstrap】 bootstrap-select2下拉菜单插件
- fullpage.js(cndjs)
- 三天学会HTML5 ——多媒体元素的使用
- Java设计模式中的单例模式
- Arduino的软件:Arduino IDE和Mind+图形化编程
- 业务流程图有哪些?一篇文章带你了解和绘制业务流程图
- oracle中文转换为unicode,Oracle数据库字符集转换成Unicode产品开发
- k8s+containerd+kata-containers 安装
- 滴滴Uber神州易到,共享出行四国军棋沙盘推演
- Oracle数据库的数据备份
- 暗黑2魔电西格玛攻略_魔电西格玛,暗黑2最佳继承者-1949游戏测评
- 服务器怎么解压文件夹,怎么在云服务器上解压文件夹
- 不锈钢无缝钢管重量计算公式