現在の位置: ホーム> 最新記事一覧> socket_accept()を使用して、カスタムプロトコルサーバーを実装します

socket_accept()を使用して、カスタムプロトコルサーバーを実装します

M66 2025-05-18

高性能で柔軟なネットワークサービスを構築する場合、PHPはWebアプリケーションの構築に限定されず、基礎となるネットワーク通信を処理することもできます。 PHPのソケット拡張機能を介して、カスタムプロトコルに基づいてサーバー側プログラムを作成できます。この記事では、基本原則や完全な例を含むsocket_accept()を使用してカスタムプロトコルサーバーを実装する方法の詳細な紹介について説明します。

1。socket_accept()とは何ですか?

socket_accept()は、クライアントからの接続要求を受け入れるPHPソケット拡張機能の関数です。サーバーがsocket_create()socket_bind()を介してリスニングを確立すると、 socket_listen()を使用して接続の聴取を開始し、 socket_accept()はこれらの接続を受信する責任があります。クライアント接続が発生すると、クライアントと通信するための新しいソケットを返します。

要するに、そのプロセスは次のとおりです。

  1. ソケットを作成します。

  2. アドレスとポートをバインドします。

  3. 接続を聞いてください。

  4. connection( socket_accept() );

  5. クライアントとのコミュニケーション。

  6. 接続を閉じます。

2。使用状況シナリオ:カスタムプロトコルサーバー

JSON形式でリクエストを受信したり、固定形式で応答を返すなど、カスタムプロトコルサーバーを構築する必要があるとします。このサーバーは、HTTPやその他の従来のプロトコルに依存していませんが、TCPレイヤーで直接通信します。

3。完了例:PHPカスタムプロトコルサーバー

以下は、ローカルポート9000に耳を傾け、クライアントから送信されたJSONリクエストを受信し、処理結果を返すカスタムプロトコルサーバーを実装する方法を示す完全なPHPスクリプトです。

 <?php
set_time_limit(0); // スクリプトのタイムアウトを防ぎます

$host = '0.0.0.0';
$port = 9000;

// 1. 作成する socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
    die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}

// 2. アドレスとポートをバインドします
if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 3. 接続を聞き始めます
if (!socket_listen($socket, 5)) {
    die("socket_listen() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "サーバーが開始されます,モニター {$host}:{$port}...\n";

while (true) {
    // 4. 接続を受け入れます
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // 5. クライアントリクエストを読み取ります
    $input = socket_read($client, 1024);
    $input = trim($input);

    echo "リクエストを受け取りました: $input\n";

    // 分析 JSON 聞く
    $request = json_decode($input, true);
    $response = [];

    if (json_last_error() === JSON_ERROR_NONE && isset($request['action'])) {
        if ($request['action'] === 'ping') {
            $response = ['status' => 'success', 'message' => 'pong'];
        } elseif ($request['action'] === 'hello') {
            $response = ['status' => 'success', 'message' => 'Hello from m66.net!'];
        } else {
            $response = ['status' => 'error', 'message' => '不明な操作'];
        }
    } else {
        $response = ['status' => 'error', 'message' => '聞く格式错误'];
    }

    // 応答を送信します
    $output = json_encode($response) . "\n";
    socket_write($client, $output, strlen($output));

    // クライアント接続を閉じます
    socket_close($client);
}

// サーバーを閉じます socket(理論的には、ここには決してありません)
socket_close($socket);
?>

4。テスト方法

Telnetまたはカスタムクライアントツールを使用して、テストに接続できます。

 telnet 127.0.0.1 9000

貼り付け入力:

 {"action":"ping"}

サーバーが返されます:

 {"status":"success","message":"pong"}

送信することもできます:

 {"action":"hello"}

回答:

 {"status":"success","message":"Hello from m66.net!"}

5。注意すべきこと

  • すべての入力と出力は、形式の一貫性を確保する必要があり、JSONをプロトコル本文として使用することをお勧めします。

  • このサーバーはブロックしており、学習や小規模アプリケーションに適しています。

  • マルチスレッドまたはイベントベースのモデル(Swooleなど)を生産環境で使用して、並行性のパフォーマンスを向上させる必要があります。

  • サービスがパブリックネットワークに展開されている場合、IPホワイトリスト、暗号化の検証など、セキュリティ制御を確保する必要があります。

6。結論

この記事を通して、PHP socket_accept()を使用してカスタムプロトコルサーバーを作成する方法を学びました。基礎となるソケットの原則から完全な例まで、このアプローチはPHPのアプリケーション境界を広げるだけでなく、特定のシナリオに柔軟で信頼できる通信機能を提供します。このアーキテクチャは、一部の軽量サービス、イントラネット通信、またはIoTプロジェクトで大きな可能性を秘めています。