Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie Echtzeit-Online-Gaming über PHP und WebSocket

So implementieren Sie Echtzeit-Online-Gaming über PHP und WebSocket

WBOY
WBOYOriginal
2023-12-17 17:59:22766Durchsuche

So implementieren Sie Echtzeit-Online-Gaming über PHP und WebSocket

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.

Umgebungsvorbereitung

Bevor Sie beginnen, müssen Sie sicherstellen, dass die folgende Software installiert wurde:

  1. Apache-Server
  2. PHP7+ und die zu PHP passende WebSocket-Erweiterungsbibliothek
  3. HTML5-Browser

Erstellen Sie einen WebSocket-Server

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的实现,该类提供了四个方法:

  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. Im obigen Code verwenden wir die Klasse 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.
  1. onError: Diese Methode wird ausgeführt, wenn ein Fehler auftritt.
  2. Da wir nun über einen WebSocket-Server verfügen, werden wir diesen Server verwenden, um Daten von Clients zu verarbeiten und Daten an andere Clients zu senden.

Client-Verbindung binden

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 Methode conn.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();
🎜Erklärung: 🎜🎜🎜Wenn der Server Initialisierungsdaten sendet, erfassen wir die Nachricht und initialisieren das Spiel. 🎜🎜Während das Spiel läuft, können wir Daten an den Server senden und die vom Server gesendeten Daten verarbeiten. 🎜🎜🎜Codezusammenfassung🎜🎜Durch die oben genannten Schritte haben wir einen PHP-WebSocket-Server erstellt, der die Übertragung von Spieldaten abwickelt und die Datenübertragung und Spielverarbeitung auf der Clientseite implementiert. Unten finden Sie das vollständige PHP- und JavaScript-Codebeispiel. 🎜🎜PHP-Server: 🎜
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);
}
🎜Client-JavaScript-Code: 🎜rrreee🎜In diesem Beispiel zeigen wir, wie Sie PHP und WebSocket verwenden, um Echtzeit-Online-Spiele zu implementieren, und stellen Beispielcode bereit. Sie können es an Ihre Bedürfnisse anpassen und modifizieren. 🎜

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn