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.
Sebelum anda bermula, anda perlu memastikan perisian berikut telah dipasang:
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();
$clients
. Apabila satu pelanggan menghantar mesej, pelayan menghantar mesej kepada semua pelanggan kecuali klien tersebut. $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
Dalam 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. function handleServerMessages(data) { if (data === 'init') { // 初始化游戏 return; } // 处理游戏数据 // ... // 向服务器发送游戏数据 conn.send(data); }
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.
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();
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); }
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!