PHP+Socketシリーズはクライアントとサーバー間のデータ転送を実現します

藏色散人
リリース: 2023-04-11 10:18:01
転載
4952 人が閲覧しました

この記事では、PHP ソケットに関する関連知識を提供します。主にソケットとは何か? について紹介します。 PHPソケットはどのようにしてクライアントとサーバー間のデータ送信を実現するのでしょうか?興味のある方は以下をご覧ください。皆様のお役に立てれば幸いです。

ソケットの概要

ネットワーク プロセス間の通信を実現するために、ほとんどすべてのアプリケーションはソケットを使用します。ソケットは、アプリケーション層と TCP/IP プロトコル ファミリの間の中間通信です。抽象化レイヤー。インターフェイスのセットです。設計モードでは、ソケットは実際にはファサード モードであり、複雑な TCP/IP プロトコル ファミリをソケット インターフェイスの背後に隠します。ユーザーにとっては、一連の単純なインターフェイスがすべてであり、ソケットが指定された仕様に準拠するようにデータを編成できるようになります。プロトコル

PHP+Socketシリーズはクライアントとサーバー間のデータ転送を実現します

ソケットの本来の意味は英語で「穴」「ソケット」ですが、一般に「ソケット」とも呼ばれ、IPアドレスやポートの表記に使用されます。通信チェーンのハンドルを使用して、異なる仮想マシンまたは異なるコンピュータ間の通信を実装できます。

ソケットリンクの 3 つのプロセス

  • サーバーリッスン: IP ポート番号

  • クライアントリクエスト: サービスエンド IP に送信し、ポート接続リクエスト

  • リンク確認: サーバーソケットはクライアントソケット接続リクエストをリッスンまたは受信し、新しいプロセスを作成します。サーバーソケットの説明をクライアントに送信します。クライアントのリクエスト。クライアントがこの説明を確認すると、接続が確立されます。サーバーのソケットは引き続き待機状態にあり、他のクライアント ソケットからの接続要求を受け入れ続けます。

PHP+Socketシリーズはクライアントとサーバー間のデータ転送を実現します

php はソケットを実装します

php でソケットを使用する必要がある場合は、コンパイル時に -- を追加する必要がありますphp enable-sockets 設定項目を有効にするには、php -m|grepソケット コマンドを使用して有効ステータスを確認できます。具体的なコンパイル プロセスについては、この記事#を参照してください。

##クイック エクスペリエンス

サーバーとクライアントの簡略化されたコードは次のとおりです。実行後、サーバーはブロックされ、クライアントの接続を待ちます。クライアントはコンソール上で入力コンテンツを要求します。入力後、情報はサービスに表示されます。クライアントは印刷し、クライアントは大文字に変換されたコンテンツを表示します。この例のサーバーとクライアントは同じサーバー上で実行されます:

サーバーリスニング

<?php

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 设置 ip 被释放后立即可使用
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);

// 绑定ip与端口
socket_bind($socket, 0, 8888);

// 开始监听
socket_listen($socket);

while (true) {
    // 接收内容
    $conn_sock = socket_accept($socket);
    socket_getpeername($conn_sock, $ip, $port);
    // echo &#39;请求ip: &#39; . $ip . PHP_EOL . &#39;端口: &#39; . $port;

    while (true) {
        // 获取消息内容
        $msg = socket_read($conn_sock, 10240);
        // TODO 处理业务逻辑

        // 将信息转为大写并原样返回客户端
        socket_write($conn_sock, strtoupper($msg));

        echo $msg;
    }
}
ログイン後にコピー

クライアント接続

<?php

// 创建套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 连接服务端
socket_connect($socket, &#39;127.0.0.1&#39;, 8888);

while (true) {
    // 让控制台输入内容
    fwrite(STDOUT, &#39;请输入内容:&#39;);
    $in = fgets(STDIN);

    // 向服务端发送内容
    socket_write($socket, $in);

    // 读取服务端发送的消息
    $msg = socket_read($socket, 10240);
    echo $msg;
}
ログイン後にコピー

##構文説明

socket_create

socket_create(int $domain,int $type, int $protocol): resource|false
ログイン後にコピー
ソケット リソース (通常は通信ノードとも呼ばれます) を作成して返します。一般的なソケットは少なくとも 2 つのソケットで構成され、1 つはクライアント側で実行され、もう 1 つはサーバー側で実行されます。

パラメータ: