À 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.
Avant de commencer, vous devez vous assurer que les logiciels suivants ont été installés :
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
的实现,该类提供了四个方法:
onOpen
:新的客户端连接时,会执行此方法。在此方法中,我们将连接保存到$clients
数组。onMessage
:客户端发送新消息时,会执行此方法。在此方法中,我们可以处理接收到的数据,并将数据发送给其他客户端。onClose
:客户端关闭连接时,会执行此方法。在此方法中,我们从$clients
数组中移除连接。onError
:当出现错误时,会执行此方法。现在,我们已经有了一个WebSocket服务器,接下来,我们将使用该服务器来处理来自客户端的数据,以及将数据发送给其他客户端。
在客户端,我们需要通过WebSocket协议连接到服务器并初始化游戏。
var conn = new WebSocket('ws://localhost:8080'); conn.onopen = function(e) { // 发送初始化消息 conn.send('init'); }; conn.onmessage = function(e) { // 处理服务器发送的数据 handleServerMessages(e.data); };
代码解释:
conn.send()
方法向服务器发送初始化数据。请注意,这里使用了init
作为初始化数据,您可以根据实际场景调整数据内容。onmessage
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
. onError
: Cette méthode sera exécutée lorsqu'une erreur se produit. 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éthodeconn.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();
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); }
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!