Maison  >  Article  >  développement back-end  >  Comment implémenter des jeux en ligne en temps réel via PHP et WebSocket

Comment implémenter des jeux en ligne en temps réel via PHP et WebSocket

WBOY
WBOYoriginal
2023-12-17 17:59:22767parcourir

Comment implémenter des jeux en ligne en temps réel via PHP et WebSocket

À l'ère d'Internet, les jeux en ligne sont devenus une forme de divertissement de plus en plus populaire. De nombreux jeux nécessitent une interaction en temps réel, ce qui signifie établir une connexion avec le serveur, transmettre des données en temps réel et une communication peer-to-peer. Utiliser PHP et WebSocket pour transmettre les données du jeu au client en temps réel est donc une excellente solution. . Ensuite, nous utiliserons un exemple pour présenter comment utiliser PHP et WebSocket pour implémenter des jeux en ligne en temps réel.

Préparation de l'environnement

Avant de commencer, vous devez vous assurer que les logiciels suivants ont été installés :

  1. Serveur Apache
  2. PHP7+ et la bibliothèque d'extension WebSocket correspondant à PHP
  3. Navigateur HTML5

Créer un serveur WebSocket

Nous utiliserons la bibliothèque Ratchet pour créer des serveurs WebSocket. Veuillez vous assurer que votre version PHP est compatible avec la bibliothèque Ratchet et que la bibliothèque Ratchet a été correctement installée.

require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class GameServer implements MessageComponentInterface
{
    private $clients = [];

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients[$conn->resourceId] = $conn;
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {
        //可以在此处对接收到的数据进行处理
        foreach($this->clients as $client) {
            if ($from !== $client) {
                //将消息发送给客户端
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn)
    {
        unset($this->clients[$conn->resourceId]);
    }

    public function onError(ConnectionInterface $conn, Exception $e)
    {
        echo "Error: ".$e->getMessage(). "
";
        $conn->close();
    }
}

$server = new RatchetApp('localhost', 8080);
$server->route('/', new GameServer());
$server->run();

Avec le code ci-dessus, nous avons créé un serveur WebSocket de base. Lorsqu'un client se connecte au serveur, le serveur ajoute la connexion au tableau $clients. Lorsqu'un client envoie un message, le serveur envoie le message à tous les clients sauf ce client. $clients数组中。当一个客户端发送消息时,服务器将消息发送给除该客户端以外的所有客户端。

在上述代码中,我们将GameServer类作为MessageComponentInterface的实现,该类提供了四个方法:

  1. onOpen:新的客户端连接时,会执行此方法。在此方法中,我们将连接保存到$clients数组。
  2. onMessage:客户端发送新消息时,会执行此方法。在此方法中,我们可以处理接收到的数据,并将数据发送给其他客户端。
  3. onClose:客户端关闭连接时,会执行此方法。在此方法中,我们从$clients数组中移除连接。
  4. onError:当出现错误时,会执行此方法。

现在,我们已经有了一个WebSocket服务器,接下来,我们将使用该服务器来处理来自客户端的数据,以及将数据发送给其他客户端。

绑定客户端连接

在客户端,我们需要通过WebSocket协议连接到服务器并初始化游戏。

var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function(e) {
    // 发送初始化消息
    conn.send('init');
};

conn.onmessage = function(e) {
    // 处理服务器发送的数据
    handleServerMessages(e.data);
};

代码解释:

  1. 我们使用WebSocket对象初始化一个连接,将其绑定到服务器地址和端口。
  2. 当连接建立时,我们通过 conn.send()方法向服务器发送初始化数据。请注意,这里使用了init作为初始化数据,您可以根据实际场景调整数据内容。
  3. 当服务器接收到数据后,会调用 onmessage
  4. Dans le code ci-dessus, nous utilisons la classe GameServer comme implémentation de MessageComponentInterface, qui fournit quatre méthodes :

onOpen : Ceci La méthode est exécutée lorsqu’un nouveau client se connecte. Dans cette méthode, nous enregistrons la connexion au tableau $clients.

onMessage : Cette méthode sera exécutée lorsque le client enverra un nouveau message. Dans cette méthode, nous pouvons traiter les données reçues et envoyer les données à d'autres clients.

onClose : Cette méthode sera exécutée lorsque le client fermera la connexion. Dans cette méthode, nous supprimons la connexion du tableau $clients.
  1. onError : Cette méthode sera exécutée lorsqu'une erreur se produit.
  2. Maintenant que nous disposons d'un serveur WebSocket, nous utiliserons ce serveur pour traiter les données des clients, ainsi que pour envoyer des données à d'autres clients.

Lier la connexion client

Côté client, nous devons nous connecter au serveur via le protocole WebSocket et initialiser le jeu.

function handleServerMessages(data) {
    if (data === 'init') {
        // 初始化游戏
        return;
    }

    // 处理游戏数据
    // ...

    // 向服务器发送游戏数据
    conn.send(data);
}

Explication du code :

Nous utilisons l'objet WebSocket pour initialiser une connexion et la lier à l'adresse et au port du serveur.

Lorsque la connexion est établie, nous envoyons les données d'initialisation au serveur via la méthode conn.send(). Veuillez noter que init est utilisé comme données d'initialisation. Vous pouvez ajuster le contenu des données en fonction du scénario réel. 🎜🎜Lorsque le serveur recevra les données, il appellera la méthode onmessage pour traiter les données transmises. Nous pouvons traiter les données envoyées par le serveur dans cette méthode. 🎜🎜🎜Traitement des données du jeu🎜🎜Lorsque le client se connecte au serveur et s'initialise, nous pouvons commencer à traiter les données du jeu. 🎜
require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class GameServer implements MessageComponentInterface
{
    private $clients = [];

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients[$conn->resourceId] = $conn;
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {
        //可以在此处对接收到的数据进行处理
        foreach($this->clients as $client) {
            if ($from !== $client) {
                //将消息发送给客户端
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn)
    {
        unset($this->clients[$conn->resourceId]);
    }

    public function onError(ConnectionInterface $conn, Exception $e)
    {
        echo "Error: ".$e->getMessage(). "
";
        $conn->close();
    }
}

$server = new RatchetApp('localhost', 8080);
$server->route('/', new GameServer());
$server->run();
🎜Explication : 🎜🎜🎜Lorsque le serveur envoie des données d'initialisation, nous capturons le message et initialisons le jeu. 🎜🎜Pendant le jeu, nous pouvons envoyer des données au serveur et traiter les données envoyées par le serveur. 🎜🎜🎜Résumé du code🎜🎜Grâce aux étapes ci-dessus, nous avons créé un serveur PHP WebSocket pour gérer la transmission des données de jeu et implémenter la transmission de données et le traitement du jeu côté client. Vous trouverez ci-dessous l'exemple complet de code PHP et JavaScript. 🎜🎜Serveur PHP : 🎜
var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function(e) {
    // 发送初始化消息
    conn.send('init');
};

conn.onmessage = function(e) {
    // 处理服务器发送的数据
    handleServerMessages(e.data);
};

function handleServerMessages(data) {
    if (data === 'init') {
        // 初始化游戏
        return;
    }

    // 处理游戏数据
    // ...

    // 向服务器发送游戏数据
    conn.send(data);
}
🎜Code JavaScript du client : 🎜rrreee🎜Dans cet exemple, nous montrons comment utiliser PHP et WebSocket pour implémenter des jeux en ligne en temps réel et fournissons un exemple de code. Vous pouvez l'ajuster et le modifier en fonction de vos besoins. 🎜

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