Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan permainan dalam talian masa nyata melalui PHP dan WebSocket

Bagaimana untuk melaksanakan permainan dalam talian masa nyata melalui PHP dan WebSocket

WBOY
WBOYasal
2023-12-17 17:59:22767semak imbas

Bagaimana untuk melaksanakan permainan dalam talian masa nyata melalui PHP dan WebSocket

Dalam era Internet, permainan dalam talian telah menjadi satu bentuk hiburan yang semakin popular. Banyak permainan memerlukan interaksi masa nyata, yang bermaksud mewujudkan sambungan dengan pelayan, menghantar data dalam masa nyata, dan komunikasi peer-to-peer, jadi menggunakan PHP dan WebSocket untuk menghantar data permainan kepada pelanggan dalam masa nyata adalah sangat baik. penyelesaian. Seterusnya, kami akan menggunakan contoh untuk memperkenalkan cara menggunakan PHP dan WebSocket untuk melaksanakan permainan dalam talian masa nyata.

Persediaan alam sekitar

Sebelum anda bermula, anda perlu memastikan perisian berikut telah dipasang:

  1. Pelayan Apache
  2. PHP7+ dan pustaka sambungan WebSocket yang sepadan dengan PHP
  3. Pelayar HTML5

Kami akan menggunakan perpustakaan Ratchet untuk mencipta pelayan WebSocket. Sila pastikan versi PHP anda serasi dengan pustaka Ratchet dan pustaka Ratchet telah dipasang dengan betul.

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();

Dengan kod di atas, kami telah mencipta pelayan WebSocket asas. Apabila pelanggan menyambung ke pelayan, pelayan menambah sambungan pada tatasusunan $clients. Apabila satu pelanggan menghantar mesej, pelayan menghantar mesej kepada semua pelanggan kecuali klien tersebut.

$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. 当服务器接收到数据后,会调用 onmessageDalam kod di atas, kami menggunakan kelas GameServer sebagai pelaksanaan MessageComponentInterface, yang menyediakan empat kaedah:

onOpen: Ini kaedah dilaksanakan apabila pelanggan baru menyambung. Dalam kaedah ini, kami menyimpan sambungan ke tatasusunan $clients.

onMessage: Kaedah ini akan dilaksanakan apabila pelanggan menghantar mesej baharu. Dalam kaedah ini kita boleh memproses data yang diterima dan menghantar data kepada pelanggan lain.

onClose: Kaedah ini akan dilaksanakan apabila pelanggan menutup sambungan. Dalam kaedah ini, kami mengalih keluar sambungan daripada tatasusunan $clients.

    onError: Kaedah ini akan dilaksanakan apabila ralat berlaku.
  1. Sekarang kami mempunyai pelayan WebSocket, kami akan menggunakan pelayan ini untuk memproses data daripada pelanggan, serta menghantar data kepada pelanggan lain.
Ikat sambungan pelanggan

Di sisi pelanggan, kita perlu menyambung ke pelayan melalui protokol WebSocket dan memulakan permainan.

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

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

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

Penjelasan kod:

Kami menggunakan objek WebSocket untuk memulakan sambungan dan mengikatnya pada alamat pelayan dan port.

Apabila sambungan diwujudkan, kami menghantar data permulaan kepada pelayan melalui kaedah conn.send(). Sila ambil perhatian bahawa init digunakan sebagai data permulaan Anda boleh melaraskan kandungan data mengikut senario sebenar.

🎜Apabila pelayan menerima data, ia akan memanggil kaedah onmessage untuk memproses data yang dihantar Kami boleh memproses data yang dihantar oleh pelayan dalam kaedah ini. 🎜🎜🎜Memproses data permainan🎜🎜Apabila pelanggan menyambung ke pelayan dan memulakan, kami boleh mula memproses data permainan. 🎜
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();
🎜Penjelasan: 🎜🎜🎜Apabila pelayan menghantar data permulaan, kami menangkap mesej dan memulakan permainan. 🎜🎜Semasa permainan berjalan, kami boleh menghantar data ke pelayan dan memproses data yang dihantar oleh pelayan. 🎜🎜🎜Ringkasan Kod🎜🎜Melalui langkah di atas, kami telah mencipta pelayan PHP WebSocket untuk mengendalikan penghantaran data permainan, dan melaksanakan penghantaran data dan pemprosesan permainan di sisi pelanggan. Di bawah ialah contoh kod PHP dan JavaScript yang lengkap. 🎜🎜Pelayan 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);
}
🎜Kod JavaScript pelanggan: 🎜rrreee🎜Dalam contoh ini, kami menunjukkan cara menggunakan PHP dan WebSocket untuk melaksanakan permainan dalam talian masa nyata dan menyediakan beberapa kod sampel. Anda boleh melaraskan dan mengubah suainya mengikut keperluan anda. 🎜

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan permainan dalam talian masa nyata melalui PHP dan WebSocket. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn