Maison  >  Article  >  développement back-end  >  Système de chat en temps réel basé sur PHP avec salle de chat et capacités de jeu en ligne

Système de chat en temps réel basé sur PHP avec salle de chat et capacités de jeu en ligne

PHPz
PHPzoriginal
2023-08-27 09:04:45670parcourir

Système de chat en temps réel basé sur PHP avec salle de chat et capacités de jeu en ligne

Fonctions de salon de discussion et de jeu en ligne du système de discussion en temps réel basé sur PHP

Avec le développement et la vulgarisation continus de la technologie Internet, la communication en temps réel est devenue un élément indispensable de la vie des gens. En tant qu'élément important, le système de chat en temps réel a été largement utilisé sur diverses plateformes sociales et sites Web en ligne. Cet article présentera un système de chat en temps réel basé sur PHP et comment ajouter des salles de chat et des fonctions de jeu en ligne.

La clé d'un système de chat en temps réel est de pouvoir mettre en œuvre des fonctions de messagerie instantanée afin que les utilisateurs puissent envoyer et recevoir des messages dans le système en temps réel. En PHP, la technologie WebSocket peut être utilisée pour réaliser une communication en temps réel. WebSocket est un protocole de communication en duplex intégral sur une seule connexion TCP, capable de fournir des connexions persistantes sans imposer trop de charge au serveur.

Tout d'abord, nous devons créer un serveur WebSocket pour gérer l'envoi et la réception de messages en temps réel. Voici un exemple de code PHP simple :

<?php
$server = new SwooleWebSocketServer("0.0.0.0", 9501);

// 监听 WebSocket 连接打开事件
$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "客户端 {$request->fd} 进入聊天室
";
});

// 监听 WebSocket 消息事件
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    echo "收到客户端消息:{$frame->data}
";

    // 将消息发送给所有连接的客户端
    foreach ($server->connections as $fd) {
        $server->push($fd, $frame->data);
    }
});

// 监听 WebSocket 连接关闭事件
$server->on('close', function ($ser, $fd) {
    echo "客户端 {$fd} 离开聊天室
";
});

// 启动 WebSocket 服务器
$server->start();
?>

Dans le code ci-dessus, nous utilisons l'extension Swoole pour créer un serveur WebSocket. Lorsqu'un nouveau client se connecte, l'événement open sera déclenché Lorsqu'un client envoie un message, l'événement message sera déclenché Lorsqu'un client ferme la connexion, le <. l code>message sera déclenché. Déclenchez l'événement close. Nous pouvons effectuer le traitement correspondant dans les fonctions de rappel de ces événements. open事件,当有客户端发送消息时,会触发message事件,当有客户端关闭连接时,会触发close事件。我们可以在这些事件的回调函数中进行相应的处理。

接下来,我们可以为聊天室添加一些基本的功能,例如显示在线用户列表和私聊功能。修改上述代码:

<?php
$server = new SwooleWebSocketServer("0.0.0.0", 9501);

// 在线用户列表
$onlineUsers = [];

// 监听 WebSocket 连接打开事件
$server->on('open', function (SwooleWebSocketServer $server, $request) use (&$onlineUsers) {
    echo "客户端 {$request->fd} 进入聊天室
";

    // 将用户添加到在线用户列表
    $onlineUsers[$request->fd] = $request->fd;
});

// 监听 WebSocket 消息事件
$server->on('message', function (SwooleWebSocketServer $server, $frame) use (&$onlineUsers) {
    echo "收到客户端消息:{$frame->data}
";

    $data = json_decode($frame->data, true);

    // 判断消息类型
    switch ($data['type']) {
        case 'message':
            // 将消息发送给所有连接的客户端
            foreach ($onlineUsers as $fd) {
                $server->push($fd, json_encode([
                    'type' => 'message',
                    'username' => $data['username'],
                    'content' => $data['content'],
                ]));
            }
            break;
        case 'private_message':
            // 私聊功能
            $receiver = $data['receiver'];
            $content = $data['content'];

            // 判断接收者是否在线
            if (isset($onlineUsers[$receiver])) {
                $server->push($receiver, json_encode([
                    'type' => 'private_message',
                    'sender' => $frame->fd,
                    'content' => $content,
                ]));
            } else {
                // 如果接收者不在线,则提示发送失败
                $server->push($frame->fd, json_encode([
                    'type' => 'error',
                    'content' => '发送失败,接收者不在线!',
                ]));
            }
            break;
    }
});

// 监听 WebSocket 连接关闭事件
$server->on('close', function ($ser, $fd) use (&$onlineUsers) {
    echo "客户端 {$fd} 离开聊天室
";

    // 将用户从在线用户列表中移除
    unset($onlineUsers[$fd]);
});

// 启动 WebSocket 服务器
$server->start();
?>

在上述代码中,我们添加了一个$onlineUsers数组,用来保存在线用户的fd。当有新的用户连接时,将其fd添加到该数组中;当有用户断开连接时,从数组中移除。并且在消息事件中,我们增加了判断消息类型的逻辑,如果是私聊消息,则向接收者发送私聊内容,否则向所有连接的客户端广播聊天内容。

除了聊天室功能之外,我们还可以为实时聊天系统添加在线游戏功能。例如,我们可以实现一个猜数字游戏。修改上述代码:

// 监听 WebSocket 消息事件
$server->on('message', function (SwooleWebSocketServer $server, $frame) use (&$onlineUsers) {
    echo "收到客户端消息:{$frame->data}
";

    $data = json_decode($frame->data, true);

    // 判断消息类型
    switch ($data['type']) {
        ...
        case 'guess_number':
            // 猜数字游戏
            $numbers = range(1, 10);
            $answer = array_rand($numbers);

            if ($data['number'] == $answer) {
                $server->push($frame->fd, json_encode([
                    'type' => 'guess_number',
                    'result' => '猜对了!',
                ]));
            } else {
                $server->push($frame->fd, json_encode([
                    'type' => 'guess_number',
                    'result' => '猜错了!答案是' . $answer,
                ]));
            }
            break;
    }
});

在上述代码中,我们添加了一个guess_number

Ensuite, nous pouvons ajouter quelques fonctions de base au salon de discussion, telles que l'affichage d'une liste d'utilisateurs en ligne et des fonctions de chat privé. Modifiez le code ci-dessus :

rrreee

Dans le code ci-dessus, nous avons ajouté un tableau $onlineUsers pour enregistrer le fd des utilisateurs en ligne. Lorsqu'un nouvel utilisateur se connecte, son fd est ajouté au tableau ; lorsqu'un utilisateur se déconnecte, il est supprimé du tableau. Et dans l'événement de message, nous avons ajouté une logique pour déterminer le type de message. S'il s'agit d'un message de discussion privé, le contenu du chat privé sera envoyé au destinataire, sinon le contenu du chat sera diffusé à tous les clients connectés. 🎜🎜En plus de la fonctionnalité de salle de discussion, nous pouvons également ajouter une fonctionnalité de jeu en ligne au système de chat en direct. Par exemple, nous pouvons mettre en œuvre un jeu de devinettes. Modifiez le code ci-dessus : 🎜rrreee🎜Dans le code ci-dessus, nous avons ajouté un type de message guess_number pour gérer la logique du jeu de devinettes. Lorsqu'un client envoie un message pour deviner un nombre, le serveur génère une réponse aléatoire, la compare à la réponse du client et renvoie le résultat au client. 🎜🎜Avec l'exemple de code ci-dessus, nous pouvons implémenter un système de chat en temps réel simple basé sur PHP et ajouter des salles de chat et des fonctions de jeu en ligne. Bien sûr, il ne s’agit que d’un exemple simple, et davantage de détails et de sécurité doivent être pris en compte dans les applications réelles. J'espère que cet article vous aidera ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn