swoole搭建一个支持单聊与群聊的即时通讯websocket前后端笔记

swoole搭建一个支持单聊与群聊的即时通讯websocket前后端笔记

800_auto

首先是服务端

<?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%

{{collectdata}}

网友评论