ホームページ  >  記事  >  バックエンド開発  >  チャット ルームとオンライン ゲーム機能を備えた PHP ベースのリアルタイム チャット システム

チャット ルームとオンライン ゲーム機能を備えた PHP ベースのリアルタイム チャット システム

PHPz
PHPzオリジナル
2023-08-27 09:04:45669ブラウズ

チャット ルームとオンライン ゲーム機能を備えた PHP ベースのリアルタイム チャット システム

PHP ベースのリアルタイム チャット システムのチャット ルームおよびオンライン ゲーム機能

インターネット技術の継続的な発展と普及により、リアルタイム コミュニケーションが一般的なものになりました。人々の生活に欠かせないもの、欠けているもの。その重要な部分として、リアルタイム チャット システムはさまざまなオンライン ソーシャル プラットフォームや Web サイトで広く使用されています。この記事では、PHP をベースにしたリアルタイム チャット システムと、チャット ルームやオンライン ゲーム機能の追加方法を紹介します。

リアルタイム チャット システムの鍵は、ユーザーがシステム内でリアルタイムにメッセージを送受信できるようにインスタント メッセージング機能を実装できることです。 PHP では、WebSocket テクノロジーを使用してリアルタイム通信を実現できます。 WebSocket は、単一の TCP 接続を介した全二重通信用のプロトコルであり、サーバーに過度の負担をかけずに永続的な接続を提供できます。

まず、リアルタイム メッセージの送受信を処理する WebSocket サーバーを作成する必要があります。以下は簡単な PHP コードの例です。

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

上記のコードでは、Swoole 拡張機能を使用して WebSocket サーバーを作成します。新しいクライアントが接続すると、open イベントがトリガーされます。クライアントがメッセージを送信すると、message イベントがトリガーされます。クライアントが接続を閉じると、# がトリガーされます。 ##閉じるイベント。これらのイベントのコールバック関数で対応する処理を実行できます。

次に、オンライン ユーザーのリストの表示やプライベート チャット機能など、チャット ルームにいくつかの基本機能を追加します。上記のコードを変更します。

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

上記のコードでは、オンライン ユーザーの

fd を保存するために $onlineUsers 配列を追加しました。新しいユーザーが接続すると、その 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 メッセージ タイプを追加しました。クライアントが数字を推測するメッセージを送信すると、サーバーはランダムな回答を生成し、それをクライアントの推測と比較し、結果をクライアントに返します。

上記のサンプル コードを通じて、PHP ベースのシンプルなリアルタイム チャット システムを実装し、チャット ルームやオンライン ゲーム機能を追加できます。もちろん、これは単純な例にすぎず、実際のアプリケーションではさらに詳細とセキュリティを考慮する必要があります。この記事がお役に立てば幸いです!

以上がチャット ルームとオンライン ゲーム機能を備えた PHP ベースのリアルタイム チャット システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。