swoole端
<?php // 创建一个WebSocket服务器 $ws = new Swoole\WebSocket\Server("0.0.0.0", 9501); // 创建一个Swoole Table实例,用于存储消息队列 $table = new Swoole\Table(1024); // 设置表容量 $table->column('topic', Swoole\Table::TYPE_STRING, 64); // 主题 $table->column('message', Swoole\Table::TYPE_STRING, 255); // 消息 $table->create(); // 监听WebSocket连接打开事件 $ws->on('open', function ($ws, $request) { echo "Client {$request->fd} connected.\n"; }); // 监听WebSocket消息事件 $ws->on('message', function ($ws, $frame) use ($table) { // 解析客户端发送的消息 $data = json_decode($frame->data, true); // 检查是否为发布消息操作 if (isset($data['action']) && $data['action'] === 'publish') { // 存储消息到Table $key = uniqid(); // 生成唯一键 $table->set($key, ['topic' => $data['topic'], 'message' => $data['message']]); // 广播消息给所有已订阅此主题的客户端 broadcastMessage($ws, $data['topic']); } }); // 监听WebSocket连接关闭事件 $ws->on('close', function ($ws, $fd) { echo "Client {$fd} disconnected.\n"; }); // 启动服务器 $ws->start(); // 广播消息给已订阅特定主题的客户端 function broadcastMessage(Swoole\WebSocket\Server $ws, $topic) { global $table; // 遍历所有连接的客户端 foreach ($ws->connections as $fd) { // 获取客户端发送的订阅主题 $clientTopic = $ws->exist($fd) ? $ws->connection_info($fd)['topic'] : null; // 如果客户端订阅了该主题,则广播消息 if ($clientTopic === $topic) { // 遍历存储的消息,找到匹配主题的消息并发送 $table->rewind(); while ($row = $table->current()) { if ($row['topic'] === $topic) { $ws->push($fd, json_encode(['topic' => $topic, 'message' => $row['message']])); } $table->next(); } } } }html端js连接websocket示例代码
<script> var ws = new WebSocket("ws://localhost:9501"); ws.onopen = function() { console.log("Connected to server"); ws.send(JSON.stringify({action: 'subscribe', topic: 'myTopic'})); }; ws.onmessage = function(event) { var data = JSON.parse(event.data); console.log("Received message:", data.topic, data.message); }; </script>
网友回复
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?
js在浏览器中如何使用MediaStream与MediaRecorder实现声音音频多轨道混流?