Rumah > Artikel > pembangunan bahagian belakang > Sistem sembang masa nyata berasaskan PHP dengan bilik sembang dan keupayaan permainan dalam talian
Ruang sembang dan fungsi permainan dalam talian sistem sembang masa nyata berasaskan PHP
Dengan perkembangan berterusan dan mempopularkan teknologi Internet, komunikasi masa nyata telah menjadi bahagian yang amat diperlukan dalam kehidupan orang ramai. Sebagai bahagian penting daripadanya, sistem sembang masa nyata telah digunakan secara meluas dalam pelbagai platform sosial dalam talian dan laman web. Artikel ini akan memperkenalkan sistem sembang masa nyata berdasarkan PHP dan cara menambah bilik sembang dan fungsi permainan dalam talian.
Kunci kepada sistem sembang masa nyata adalah untuk dapat melaksanakan fungsi pemesejan segera supaya pengguna boleh menghantar dan menerima mesej dalam sistem dalam masa nyata. Dalam PHP, teknologi WebSocket boleh digunakan untuk mencapai komunikasi masa nyata. WebSocket ialah protokol untuk komunikasi dupleks penuh melalui sambungan TCP tunggal, yang mampu menyediakan sambungan berterusan tanpa meletakkan terlalu banyak beban pada pelayan.
Pertama, kita perlu mencipta pelayan WebSocket untuk mengendalikan penghantaran dan penerimaan mesej masa nyata. Berikut ialah contoh kod PHP mudah:
<?php $server = new SwooleWebSocketServer("0.0.0.0", 9501); // 监听 WebSocket 连接打开事件 $server->on('open', function (SwooleWebSocketServer $server, $request) { echo "客户端 {$request->fd} 进入聊天室 "; }); // 监听 WebSocket 消息事件 $server->on('message', function (SwooleWebSocketServer $server, $frame) { echo "收到客户端消息:{$frame->data} "; // 将消息发送给所有连接的客户端 foreach ($server->connections as $fd) { $server->push($fd, $frame->data); } }); // 监听 WebSocket 连接关闭事件 $server->on('close', function ($ser, $fd) { echo "客户端 {$fd} 离开聊天室 "; }); // 启动 WebSocket 服务器 $server->start(); ?>
Dalam kod di atas, kami menggunakan sambungan Swoole untuk mencipta pelayan WebSocket. Apabila pelanggan baharu bersambung, acara open
akan dicetuskan Apabila pelanggan menghantar mesej, acara message
akan dicetuskan Apabila pelanggan menutup sambungan, mesej akan dicetuskan. Kami boleh melakukan pemprosesan yang sepadan dalam fungsi panggil balik acara ini. open
事件,当有客户端发送消息时,会触发message
事件,当有客户端关闭连接时,会触发close
事件。我们可以在这些事件的回调函数中进行相应的处理。
接下来,我们可以为聊天室添加一些基本的功能,例如显示在线用户列表和私聊功能。修改上述代码:
<?php $server = new SwooleWebSocketServer("0.0.0.0", 9501); // 在线用户列表 $onlineUsers = []; // 监听 WebSocket 连接打开事件 $server->on('open', function (SwooleWebSocketServer $server, $request) use (&$onlineUsers) { echo "客户端 {$request->fd} 进入聊天室 "; // 将用户添加到在线用户列表 $onlineUsers[$request->fd] = $request->fd; }); // 监听 WebSocket 消息事件 $server->on('message', function (SwooleWebSocketServer $server, $frame) use (&$onlineUsers) { echo "收到客户端消息:{$frame->data} "; $data = json_decode($frame->data, true); // 判断消息类型 switch ($data['type']) { case 'message': // 将消息发送给所有连接的客户端 foreach ($onlineUsers as $fd) { $server->push($fd, json_encode([ 'type' => 'message', 'username' => $data['username'], 'content' => $data['content'], ])); } break; case 'private_message': // 私聊功能 $receiver = $data['receiver']; $content = $data['content']; // 判断接收者是否在线 if (isset($onlineUsers[$receiver])) { $server->push($receiver, json_encode([ 'type' => 'private_message', 'sender' => $frame->fd, 'content' => $content, ])); } else { // 如果接收者不在线,则提示发送失败 $server->push($frame->fd, json_encode([ 'type' => 'error', 'content' => '发送失败,接收者不在线!', ])); } break; } }); // 监听 WebSocket 连接关闭事件 $server->on('close', function ($ser, $fd) use (&$onlineUsers) { echo "客户端 {$fd} 离开聊天室 "; // 将用户从在线用户列表中移除 unset($onlineUsers[$fd]); }); // 启动 WebSocket 服务器 $server->start(); ?>
在上述代码中,我们添加了一个$onlineUsers
数组,用来保存在线用户的fd
。当有新的用户连接时,将其fd
添加到该数组中;当有用户断开连接时,从数组中移除。并且在消息事件中,我们增加了判断消息类型的逻辑,如果是私聊消息,则向接收者发送私聊内容,否则向所有连接的客户端广播聊天内容。
除了聊天室功能之外,我们还可以为实时聊天系统添加在线游戏功能。例如,我们可以实现一个猜数字游戏。修改上述代码:
// 监听 WebSocket 消息事件 $server->on('message', function (SwooleWebSocketServer $server, $frame) use (&$onlineUsers) { echo "收到客户端消息:{$frame->data} "; $data = json_decode($frame->data, true); // 判断消息类型 switch ($data['type']) { ... case 'guess_number': // 猜数字游戏 $numbers = range(1, 10); $answer = array_rand($numbers); if ($data['number'] == $answer) { $server->push($frame->fd, json_encode([ 'type' => 'guess_number', 'result' => '猜对了!', ])); } else { $server->push($frame->fd, json_encode([ 'type' => 'guess_number', 'result' => '猜错了!答案是' . $answer, ])); } break; } });
在上述代码中,我们添加了一个guess_number
rrreee
Dalam kod di atas, kami menambahkan tatasusunan$onlineUsers
untuk menyimpan fd
pengguna dalam talian. Apabila pengguna baharu menyambung, fd
nya ditambahkan pada tatasusunan apabila pengguna memutuskan sambungan, ia dialih keluar daripada tatasusunan. Dan dalam acara mesej, kami menambah logik untuk menentukan jenis mesej Jika ia adalah mesej sembang peribadi, kandungan sembang peribadi akan dihantar kepada penerima, jika tidak kandungan sembang akan disiarkan kepada semua pelanggan yang disambungkan. 🎜🎜Selain kefungsian bilik sembang, kami juga boleh menambah fungsi permainan dalam talian pada sistem sembang langsung. Sebagai contoh, kita boleh melaksanakan permainan meneka nombor. Ubah suai kod di atas: 🎜rrreee🎜Dalam kod di atas, kami menambahkan jenis mesej guess_number
untuk mengendalikan logik permainan tekaan. Apabila pelanggan menghantar mesej untuk meneka nombor, pelayan menjana jawapan rawak, membandingkannya dengan tekaan pelanggan, dan mengembalikan hasilnya kepada pelanggan. 🎜🎜Dengan contoh kod di atas, kami boleh melaksanakan sistem sembang masa nyata ringkas berdasarkan PHP dan menambah bilik sembang dan fungsi permainan dalam talian. Sudah tentu, ini hanyalah contoh mudah, dan lebih banyak butiran serta keselamatan perlu dipertimbangkan dalam aplikasi sebenar. Harap artikel ini membantu anda! 🎜Atas ialah kandungan terperinci Sistem sembang masa nyata berasaskan PHP dengan bilik sembang dan keupayaan permainan dalam talian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!