Workerman 实战项目:构建高并发 WebSocket 聊天系统与 API 服务
                           
天天向上
发布: 2025-01-20 23:33:26

原创
915 人浏览过

在这一部分,我们通过实战项目帮助您更好地理解 Workerman 的应用。通过实现 WebSocket 聊天系统、RESTful HTTP API 服务,以及 TCP 客户端和服务端,您将能够掌握 Workerman 在实际开发中的多种应用场景,进一步提升开发技能。这些项目不仅展示了 Workerman 强大的实时通信能力,还涵盖了如何处理并发连接、实现用户认证等常见需求。


1. WebSocket 聊天系统

(1) 使用 Workerman 搭建一个简单的多人聊天室应用

WebSocket 协议非常适合构建实时应用,尤其是聊天系统。通过 Workerman,您可以轻松搭建一个多人聊天室,支持用户实时发送和接收消息。

创建 WebSocket 服务端

use Workerman\Worker;

$worker = new Worker('websocket://0.0.0.0:8080'); // 创建 WebSocket 服务

// 存储所有连接的客户端
$clients = [];

$worker->onConnect = function($connection) use ($clients) {
    // 当新用户连接时,存储连接
    $clients[] = $connection;
};

$worker->onMessage = function($connection, $data) use ($clients) {
    // 广播消息给所有连接的客户端
    foreach ($clients as $client) {
        if ($connection != $client) {
            $client->send($data); // 向其他客户端发送消息
        }
    }
};

$worker->onClose = function($connection) use ($clients) {
    // 用户断开连接时,从客户端列表中移除
    $clients = array_filter($clients, function($client) use ($connection) {
        return $client !== $connection;
    });
};

Worker::runAll(); // 启动服务

在这个示例中,我们创建了一个 WebSocket 服务,监听端口 8080,并在用户连接时将其添加到客户端列表中。每当接收到消息时,服务器会广播消息给所有其他连接的客户端。

(2) 实现用户登录、消息广播与私聊

为聊天系统添加用户登录和私聊功能是很常见的需求。我们可以通过客户端与服务器之间传递特定消息来区分广播消息和私聊消息。

改进后的 WebSocket 聊天系统:

use Workerman\Worker;

$worker = new Worker('websocket://0.0.0.0:8080'); // 创建 WebSocket 服务

$clients = [];

$worker->onConnect = function($connection) use ($clients) {
    $clients[] = $connection;
    // 发送欢迎信息
    $connection->send("Welcome to the chat!");
};

$worker->onMessage = function($connection, $data) use ($clients) {
    $messageData = json_decode($data, true);

    if (isset($messageData['private']) && isset($messageData['to'])) {
        // 私聊功能:发送消息给指定用户
        foreach ($clients as $client) {
            if ($client->id == $messageData['to']) {
                $client->send($messageData['message']);
                break;
            }
        }
    } else {
        // 广播消息给所有客户端
        foreach ($clients as $client) {
            $client->send($data); // 向所有客户端发送广播消息
        }
    }
};

$worker->onClose = function($connection) use ($clients) {
    // 用户断开连接时,从客户端列表中移除
    $clients = array_filter($clients, function($client) use ($connection) {
        return $client !== $connection;
    });
};

Worker::runAll(); // 启动服务

在这个示例中,我们增加了私聊功能。客户端可以发送包含 privateto 字段的消息,表示要向特定用户发送私聊信息。如果没有指定私聊对象,则默认广播消息给所有连接的客户端。


2. HTTP API 服务

(1) 搭建一个 RESTful 风格的 HTTP 服务

RESTful API 是现代 Web 开发中常见的风格。Workerman 允许您轻松搭建一个高性能的 HTTP 服务,支持 CRUD 操作等。

创建 HTTP 服务端

use Workerman\Worker;
use Workerman\Protocols\Http;

$worker = new Worker('http://0.0.0.0:8080'); // 创建 HTTP 服务

$worker->onMessage = function($connection, $data) {
    $requestUri = $data->uri; // 获取请求 URI

    // 处理 GET 请求
    if ($requestUri == '/users' && $data->method == 'GET') {
        $connection->send(json_encode(['users' => ['Alice', 'Bob', 'Charlie']]));
    } elseif ($requestUri == '/user' && $data->method == 'POST') {
        $connection->send(json_encode(['message' => 'User created successfully']));
    } else {
        $connection->send("404 Not Found");
    }
};

Worker::runAll(); // 启动服务

在这个示例中,我们创建了一个简单的 RESTful API,处理 GETPOST 请求。请求 /users 返回所有用户列表,/user 路径处理用户创建请求。

(2) 实现用户认证与权限控制

通常 RESTful API 会包含用户认证和权限控制。在 Workerman 中,您可以通过简单的身份验证机制来实现这一功能。

用户认证示例:

$worker->onMessage = function($connection, $data) {
    $headers = $data->headers; // 获取请求头

    // 获取认证 token
    $token = isset($headers['Authorization']) ? $headers['Authorization'] : null;

    if ($token == 'valid_token') {
        $connection->send("Authenticated");
    } else {
        $connection->send("Unauthorized");
    }
};

在这个示例中,API 会检查请求头中的 Authorization 字段,验证 token 是否有效,如果无效则返回 401 错误。


3. TCP 服务与客户端

(1) 实现一个简单的 TCP 客户端与服务端

TCP 协议适用于高效的二进制数据传输。在 Workerman 中,您可以轻松实现一个简单的 TCP 客户端与服务端。

创建 TCP 服务端

use Workerman\Worker;

$worker = new Worker('tcp://0.0.0.0:8080'); // 创建 TCP 服务

$worker->onMessage = function($connection, $data) {
    $connection->send("Received: $data"); // 返回接收到的数据
};

Worker::runAll(); // 启动服务

创建 TCP 客户端

use Workerman\Connection\AsyncTcpConnection;

$connection = new AsyncTcpConnection('tcp://127.0.0.1:8080'); // 连接到 TCP 服务

$connection->onConnect = function($connection) {
    $connection->send("Hello TCP Server"); // 向服务器发送数据
};

$connection->onMessage = function($connection, $data) {
    echo "Received: $data\n"; // 打印接收到的数据
};

$connection->connect(); // 发起连接

在这个示例中,客户端连接到本地 TCP 服务并发送消息,服务端接收到消息后会返回并打印接收到的数据。

(2) 处理大量并发 TCP 连接

Workerman 支持高并发 TCP 连接处理。通过多进程和负载均衡机制,您可以处理数以万计的并发连接。

设置多进程

$worker->count = 8; // 启动 8 个进程处理并发连接

Workerman 会通过设置 count 属性来启动多个进程,每个进程独立处理不同的连接,从而实现高效的并发连接处理。


发表回复 0

Your email address will not be published. Required fields are marked *