Im Internetzeitalter sind Online-Spiele zu einer immer beliebter werdenden Form der Unterhaltung geworden. Viele Spiele erfordern Echtzeit-Interaktion, was den Aufbau einer Verbindung mit dem Server, die Übertragung von Daten in Echtzeit und Peer-to-Peer-Kommunikation bedeutet. Daher ist die Verwendung von PHP und WebSocket zur Übertragung von Spieldaten in Echtzeit an den Client eine hervorragende Lösung . Als nächstes stellen wir anhand eines Beispiels vor, wie man mit PHP und WebSocket Echtzeit-Onlinespiele implementiert.
Bevor Sie beginnen, müssen Sie sicherstellen, dass die folgende Software installiert wurde:
Wir werden die Ratchet-Bibliothek verwenden, um WebSocket-Server zu erstellen. Bitte stellen Sie sicher, dass Ihre PHP-Version mit der Ratchet-Bibliothek kompatibel ist und dass die Ratchet-Bibliothek korrekt installiert wurde.
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();
Mit dem obigen Code haben wir einen einfachen WebSocket-Server erstellt. Wenn ein Client eine Verbindung zum Server herstellt, fügt der Server die Verbindung zum Array $clients
hinzu. Wenn ein Client eine Nachricht sendet, sendet der Server die Nachricht an alle Clients außer diesem 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
als Implementierung von MessageComponentInterface
, die vier Methoden bereitstellt: onOpen
: Dies Die Methode wird ausgeführt, wenn ein neuer Client eine Verbindung herstellt. Bei dieser Methode speichern wir die Verbindung zum Array $clients
. onMessage
: Diese Methode wird ausgeführt, wenn der Client eine neue Nachricht sendet. Bei dieser Methode können wir die empfangenen Daten verarbeiten und an andere Clients senden. onClose
: Diese Methode wird ausgeführt, wenn der Client die Verbindung schließt. Bei dieser Methode entfernen wir die Verbindung aus dem Array $clients
. onError
: Diese Methode wird ausgeführt, wenn ein Fehler auftritt. Auf der Clientseite müssen wir über das WebSocket-Protokoll eine Verbindung zum Server herstellen und das Spiel initialisieren.
function handleServerMessages(data) { if (data === 'init') { // 初始化游戏 return; } // 处理游戏数据 // ... // 向服务器发送游戏数据 conn.send(data); }
Code-Erklärung:
Wir verwenden das WebSocket-Objekt, um eine Verbindung zu initialisieren und sie an die Serveradresse und den Port zu binden. Wenn die Verbindung hergestellt ist, senden wir Initialisierungsdaten über die Methodeconn.send()
an den Server. Bitte beachten Sie, dass init
als Initialisierungsdaten verwendet wird. Sie können den Dateninhalt entsprechend dem tatsächlichen Szenario anpassen. 🎜🎜Wenn der Server die Daten empfängt, ruft er die Methode onmessage
auf, um die übertragenen Daten zu verarbeiten. Mit dieser Methode können wir die vom Server gesendeten Daten verarbeiten. 🎜🎜🎜Spieldaten werden verarbeitet🎜🎜Wenn der Client eine Verbindung zum Server herstellt und initialisiert, können wir mit der Verarbeitung von Spieldaten beginnen. 🎜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); }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie Echtzeit-Online-Gaming über PHP und WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!