ホームページ >PHPフレームワーク >Swoole >Swooleを使用してTCPリレーサーバーを実装する方法

Swooleを使用してTCPリレーサーバーを実装する方法

WBOY
WBOYオリジナル
2023-11-07 09:11:091426ブラウズ

Swooleを使用してTCPリレーサーバーを実装する方法

Swoole は、PHP 言語をベースとした高性能ネットワーク通信フレームワークで、非同期、同時実行、イベント駆動などの機能を提供し、TCP、UDP、HTTP、WebSocket などをサポートしています。プロトコル。この記事では、具体的なコード例を示しながら、Swoole を使用して TCP リレー サーバーを実装する方法を検討します。

TCP リレー サーバーは、通常、ネットワーク上でデータを転送するために使用されます。たとえば、クライアント A が別のクライアント B にデータを送信したいと考えていますが、A と B は直接通信できません。この場合、TCP を使用できます。データを転送する中継サーバー。

TCP リレー サーバーを実装するには、次の点に注意する必要があります。

  1. クライアントの接続要求を受信し、対応する接続​​を作成します。
  2. リッスンします。接続されているすべてのデータを処理し、データを転送します。 ターゲット接続に転送します。
  3. #接続の切断を処理し、時間内に接続リソースをクリーンアップします。

以下では、特定の例を使用して、使用方法を示します。 Swoole を使用して TCP リレー サーバーを実装します。

まず、各クライアント接続の情報を保存する配列を定義します:

$clients = [];

次に、Swoole TCP サーバー オブジェクトを作成し、関連するパラメーターを設定します:

$server = new swoole_server("0.0.0.0", 9501);

$server->set([
    'worker_num' => 1,         //worker进程数
    'max_request' => 1000,     //每个worker最多处理1000个请求
    'dispatch_mode' => 2,      //使用固定模式
    'debug_mode' => 1,         //调试模式
]);

Whenサーバーが起動すると、接続イベントを処理するコールバック関数を登録します:

$server->on('connect', function ($server, $fd) {
    echo "Client: Connect.
";
    //将连接信息存入数组
    $clients[$fd] = [
        'id' => $fd,
        'remote_ip' => $server->getClientInfo($fd)['remote_ip'],
        'remote_port' => $server->getClientInfo($fd)['remote_port'],
        'target_fd' => 0  //默认为0
    ];
});

クライアントがサーバーに接続すると、「クライアント: 接続します。」というメッセージが出力され、クライアントの接続情報がファイルに保存されます。配列。

次に、受信したデータを処理するコールバック関数を登録します:

$server->on('receive', function ($server, $fd, $from_id, $data) use (&$clients) {
    //如果还没有目标连接,则需要先选择一个
    if (empty($clients[$fd]['target_fd'])) {
        foreach ($clients as $client) {
            if ($client['id'] != $fd && empty($client['target_fd'])) {
                $clients[$fd]['target_fd'] = $client['id'];
                $clients[$client['id']]['target_fd'] = $fd;
                break;
            }
        }
    }

    //将数据转发到目标连接
    $server->send($clients[$fd]['target_fd'], $data);
});

データ送信があった場合、データ内容を取得します。クライアントの接続情報に応じて、未使用のデータが取得されます。ターゲット接続を使用して、ターゲット接続を通じてデータを転送します。

最後に、接続切断イベントを処理するコールバック関数を登録します:

$server->on('close', function ($server, $fd) use (&$clients) {
    echo "Client: Close.
";
    //清理连接信息
    if (!empty($clients[$fd]['target_fd'])) {
        $target_fd = $clients[$fd]['target_fd'];
        $clients[$target_fd]['target_fd'] = 0;
    }
    unset($clients[$fd]);
});

クライアント接続が切断されると、「Client: Close.」というメッセージが出力され、接続をクリーンアップします。情報。

上記は、単純な TCP リレー サーバーの実装です。上記のコード例を通して、Swoole を使用して TCP リレー サーバーを実装することが非常に簡単であることがわかります。関連するパラメーターを定義し、コールバック関数とターゲット 各イベントに対応するロジックを記述するだけです。

以上がSwooleを使用してTCPリレーサーバーを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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