現在の位置: ホーム> 最新記事一覧> [socket_export_streamを介して、クライアントとサーバーの間に双方向通信メカニズムを実装する方法は?

[socket_export_streamを介して、クライアントとサーバーの間に双方向通信メカニズムを実装する方法は?

M66 2025-06-22

PHPネットワークプログラミングでは、 Socket_*シリーズ関数は、基礎となるネットワーク通信機能を開発者に提供します。 Stream_Socket_*シリーズ関数はより高度で使いやすいですが、 Socket_*は、基礎となる制御要件が高くなっているいくつかのシナリオでは、かけがえのない利点があります。この記事では、基礎となるソケットをsocket_export_streamを介してストリームに変換する方法を紹介し、それによりクライアントとサーバーの間の双方向通信メカニズムを実現します。

socket_export_streamとは何ですか?

socket_export_streamは、基礎となるソケットリソースをストリームリソースとしてエクスポートするためにPHPが提供する関数であるため、 fread()fwrite()などの馴染みのあるファイルフロー関数を使用してソケットデータを操作できます。このアプローチは、基礎となるソケットの柔軟性と、ストリームAPIの使いやすさを組み合わせています。

 stream socket_export_stream(Socket $socket): resource|false

FOPENStream_Selectfgetsなどの関数と組み合わせて動作するために使用できるタイプストリームのリソースを返します。


1.サーバーソケットを作成します

サーバーは、socket_create()を介してTCPソケットを作成し、ローカルアドレスとポートにバインドします。

 $serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 9501);
socket_listen($serverSocket);
echo "サーバーが開始されます,ポートを聞いてください 9501...\n";

2。接続を受け入れ、ストリームとしてエクスポートします

サーバーは、クライアント接続要求をブロックして待機し、接続リソースを読み取り可能なストリームと書き込み可能なストリームにエクスポートします。

 while (true) {
    $clientSocket = socket_accept($serverSocket);
    if ($clientSocket === false) {
        echo "接続を受け入れなかった\n";
        continue;
    }

    $clientStream = socket_export_stream($clientSocket);
    if ($clientStream === false) {
        echo "輸出 stream 失敗\n";
        socket_close($clientSocket);
        continue;
    }

    fwrite($clientStream, "ようこそ m66.net サーバ\n");
    
    while (!feof($clientStream)) {
        $data = fgets($clientStream);
        if ($data === false) break;
        echo "クライアントは言います: $data";
        fwrite($clientStream, "あなたが言ったことは:$data");
    }

    fclose($clientStream);
    socket_close($clientSocket);
}

3。サーバーへのクライアント接続

また、クライアントはSocket_Createを使用してサーバーに接続し、 Socket_Export_Streamを使用してデータを読み書きします。

 $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, 'm66.net', 9501);

$stream = socket_export_stream($client);
if ($stream === false) {
    echo "輸出 stream 失敗\n";
    exit(1);
}

echo fgets($stream); // ウェルカムメッセージを受け取ります

fwrite($stream, "こんにちは,サーバ!\n");
echo fgets($stream); // エコーを読んでください

fclose($stream);
socket_close($client);

利点と予防策

利点

  • コードは簡潔です。ストリームインターフェイスは、ソケットデータの読み取りプロセスを簡素化します。

  • 高い互換性Stream_SelectStream_set_blockingなどの関数で使用できます。

  • 双方向のコミュニケーションは自然でスムーズです。リアルタイムの応答は、ループの読み取りと書き込みを通じて達成できます。

注意すべきこと

  • socket_export_streamは、接続されたソケットにのみ使用できます。

  • 使用後、リソースの漏れを防ぐために、ストリームとソケットを閉じる必要があります。

  • ネットワーク通信は、ブロッキングやクラッシュを避けるために、例外処理とタイムアウト制御を検討する必要があります。