Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Sistem sembang masa nyata berasaskan PHP dengan bilik sembang dan keupayaan permainan dalam talian

Sistem sembang masa nyata berasaskan PHP dengan bilik sembang dan keupayaan permainan dalam talian

PHPz
PHPzasal
2023-08-27 09:04:45670semak imbas

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

Seterusnya, kita boleh menambah beberapa fungsi asas pada ruang sembang, seperti memaparkan senarai pengguna dalam talian dan fungsi sembang peribadi. Ubah suai kod di atas:

rrreee

Dalam kod di atas, kami menambahkan tatasusunan $onlineUsers untuk menyimpan fd pengguna dalam talian. Apabila pengguna baharu menyambung, fdnya 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!

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