swoole搭建一个支持单聊与群聊的即时通讯websocket前后端笔记
首先是服务端
<?php use Swoole\WebSocket\Server; use Swoole\Http\Request; use Swoole\WebSocket\Frame; use Swoole\Table; use Swoole\Lock; $server = new Server("0.0.0.0", 9501); // 创建一个 Swoole Table 来存储用户信息 $users = new Table(1024); $users->column('username', Table::TYPE_STRING, 64); $users->create(); // 创建一个 Swoole Table 来存储群组信息 $groups = new Table(1024); $groups->column('name', Table::TYPE_STRING, 64); $groups->create(); // 创建一个 Swoole Lock 来保护共享数据的读写操作 $lock = new Lock(Lock::MUTEX); $server->on('open', function (Server $server, Request $request) { echo "connection open: {$request->fd}\n"; }); $server->on('message', function (Server $server, Frame $frame) use ($users, $lock) { $data = json_decode($frame->data, true); if ($data['type'] === 'login') { $lock->lock(); $users->set($frame->fd, ['username' => $data['username']]); $lock->unlock(); echo "User logged in: {$data['username']}\n"; } elseif ($data['type'] === 'message') { // $lock->lock(); $fromUser = $users->get($frame->fd, 'username'); if ($data['to'] === 'all') { foreach ($server->connections as $fd) { if ($server->isEstablished($fd)) { $server->push($fd, json_encode([ 'type' => 'message', 'from' => $fromUser, 'message' => $data['message'] ])); } } } else { $toFd = null; foreach ($users as $key => $row) { if ($row['username'] === $data['to']) { $toFd = $key; break; } } if ($toFd !== null) { $server->push($toFd, json_encode([ 'type' => 'message', 'from' => $fromUser, 'message' => $data['message'] ])); } } // $lock->unlock(); } }); $server->on('close', function (Server $server, int $fd) use ($users, $lock) { echo "connection close: {$fd}\n"; $lock->lock(); $users->del($fd); $lock->unlock(); }); $server->start();
这段PHP代码使用Swoole扩展创建了一个WebSocket服务器,并实现了基本的用户登录、消息发送和连接关闭功能。以下是对代码的详细解释:
引入必要的类和接口:
use Swoole\WebSocket\Server; use Swoole\Http\Request; use Swoole\WebSocket\Frame; use Swoole\Table; use Swoole\Lock;
创建WebSocket服务器:
$server = new Server("0.0.0.0", 9501);
这行代码创建了一个监听所有IP地址(0.0.0.0)和端口9501的We...
点击查看剩余70%
网友评论