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%
网友评论