ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットプログラミングで一般的に使用される関数と単純なC/Sインタラクションの実装

PHPソケットプログラミングで一般的に使用される関数と単純なC/Sインタラクションの実装

不言
不言オリジナル
2018-07-26 10:18:251688ブラウズ

この記事の内容は、php ソケット プログラミングでよく使用される関数と、単純な c/s インタラクションの実装についてです。内容は非常に詳細です。必要な友人は参照してください。お役に立てれば幸いです。

ソケットの紹介

ソケットの公式説明:
ネットワーク プログラミングで最も一般的に使用されるソリューションは、クライアント/サーバー (クライアント/サーバー) モデルです。このシナリオでは、クライアント アプリケーションがサーバー プログラムにサービスを要求します。サービス プログラムは通常、既知のアドレスでサービスへのリクエストをリッスンします。つまり、クライアントがサービスのアドレスへの接続リクエストを行うまで、サービス プロセスは休止状態のままになります。この時点で、サービス プログラムは「起動」され、クライアントの要求に適切に反応してクライアントにサービスを提供します。このクライアント/サーバー モデルのネットワーク プログラミングを容易にするために、1990 年代初頭に Microsoft と他の数社が共同で WINDOWS の下で一連のネットワーク プログラミング インターフェイス、つまり Windows Sockets 仕様を開発しました。プログラミング インターフェイス: 複数のプロトコルをサポートする Windows 上の一連のオープン ネットワーク プログラミング インターフェイス。 Winsock は基本的にプロトコルに依存しなくなり、Winsock を使用して複数のプロトコルの関数を呼び出すことができますが、TCP/IP プロトコルがより一般的に使用されます。 Socket は実際には、Socket インターフェイスを持つ任意のコンピュータと通信できる通信ポートをコンピュータに提供します。アプリケーションはネットワーク上で送信し、受信した情報はこの Socket インターフェイスを通じて実現されます。

Socket は、ネットワーク上のさまざまなコンピューター アプリケーションを接続し、大量のデータを転送できるパイプとして単純に理解できます。パイプの端を投げ込むと、パイプの B 端から出てきます (C、D、E、F... 端から出ることもできます)。

#Note: さまざまなコンテキストでソケットを変更するためにさまざまな単語を使用します。ソケット自体には実際の意味がないため、概念だけを理解する必要があります。エンティティ

ソケット関数の紹介

ソケット通信は、ソケットの作成、ソケットのバインド、ソケットの監視、ソケットの送受信、ソケットのクローズといういくつかの段階を経て進行します。 PHP ネットワーク プログラミングで最も一般的に使用され、不可欠なものについてさらに説明します。

socket_create

TODO: 新しいソケット リソースを作成します

関数プロトタイプ:
resourceソケット_create (int $domain, int $type, int $protocol)次の 3 つのパラメータが含まれています:

    domain: AF_INET、AF_INET6、AF_UNIX、
  • AF

    の定義は address family、address Familyつまり、一般的に ipv4、ipv6

  • type: SOCK_STREAM、SOCK_DGRAM などを使用します。最も一般的に使用されるのは、バイト ストリームに基づく SOCKET タイプである
  • SOCK_STREAM

    です。これは、TCP プロトコルで使用されるタイプでもあります

  • プロトコル: SOL_TCP、SOL_UDP これは、使用される特定の送信プロトコルです。一般に、信頼性の高い送信のために TCP を選択し、一般に、信頼性の高い送信のために UDP プロトコルを選択します。ゲームデータ送信
  • socket_bind

TODO: 作成したソケットリソースを特定のIPアドレスとポートにバインドする

関数プロトタイプ:

boolソケット_バインド(リソース $ socket, string $ address [, int $port = 0 ] )
これには、次の 3 つのパラメータが含まれます:

    socket:
  • socket_create を使用します。

    作成されたソケットリソースは、ソケットに対応する ID とみなすことができます

  • address: ip address
  • port: listen ポート番号, WEB サーバーのデフォルトのポート 80
  • socket_listen

TODO: 特定のアドレスでのソケット リソースの送受信操作を監視する

関数プロトタイプ:

bool socket_listen (resource $socket [ , int $backlog = 0 ] )
これには、次の 2 つのパラメータが含まれます:

    socket:
  • を使用して作成されました。 socket_create

    ソケット リソース

  • backlog: 処理を待機している接続キューの最大長
  • socket_accept

TODO: リッスンした後、次の新しい接続を受信します。接続が正常に確立された場合、新しいソケット ハンドルが返されます (子プロセスとして理解できます。通常、親プロセスは新しい接続の受信に使用され、子プロセスはは特定の通信を担当します)

関数プロトタイプ:

resourcesocket_accept ( resource $socket )

    socket:
  • socket_create

    を使用して作成されたソケット リソース

  • socket_write

TODO: 指定されたデータを対応するソケット パイプに送信します

関数プロトタイプ:

intソケット_ライト (リソース $socket, string $buffer [ , int $length])

    socket:
  • socket_create

  • buffer を使用して作成されたソケット リソース: に書き込まれます。
  • socket

    resource

  • length のデータ:
  • socket

    リソースに書き込まれる buffer の長さを制御します (長さが異なる場合)。 buffer の容量を超えているため、buffer の容量を使用します

socket_read

TODO: 送信されたデータを取得する
関数プロトタイプ: intソケット_read (resource $socket, int $length)

  • socket: socket_create

  • length: socket リソース内の buffer# を使用して作成されたソケット リソース##長さ

socket_close

TODO: ソケット リソースを閉じる

関数プロトタイプ:
voidソケット_クローズ (リソース $socket)

    ##socket:
  • socket_accept

    または socket_create によって生成されたリソースは、stream リソース を閉じるために使用できません。

  • stream_socket_server

SOCKET の作成プロセスは常にソケット、バインド、リッスンであるため、PHP はポートの作成、バインド、およびポートのリッスンを一度に行うための非常に便利な関数を提供します

関数プロトタイプ:

resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )

    local_socket: プロトコル名://アドレス:ポート番号
  • errno: エラーコード
  • errstr: エラー メッセージ
  • #flags: 関数の一部のみを使用します
  • context:
  • stream_context_create## を使用して作成されたリソース ストリーム# function Context

  • socket は C/S インタラクションを実装します

上記の関数に基づいて、ソケット通信プログラムを簡単に構築できます (ここでは(後で多くのファイルを作成するため) 読者が socket

のような別のディレクトリを作成できることを願っています。まず、サーバー プログラム

server.php を次のように編集します。 ## 次に、クライアント プログラム client.php を次のように編集します。

<?php date_default_timezone_set("Asia/Shanghai");
error_reporting(E_NOTICE );

/*  确保在连接客户端时不会超时   */
set_time_limit(0);

$ip = &#39;127.0.0.1&#39;;
$port = 8090;

/*
 +-------------------------------
 *    @socket通信整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_bind      
 *    @socket_listen
 *    @socket_accept
 *    @socket_read
 *    @socket_write
 *    @socket_close
 +--------------------------------
 */

/*----------------    以下操作都是手册上的    -------------------*/
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
    echo "socket_create() Why failure is:".socket_strerror($sock)."\n";
}

if(($ret = socket_bind($sock,$ip,$port)) < 0) {
    echo "socket_bind() Why failure is:".socket_strerror($ret)."\n";
}

if(($ret = socket_listen($sock,4)) < 0) {
    echo "socket_listen() Why failure is:".socket_strerror($ret)."\n";
}

echo "Start time:".date(&#39;Y-m-d H:i:s&#39;) . PHP_EOL;
echo "Listening at ".$ip.&#39;:&#39;.$port.PHP_EOL;


do {
    /*  创建新的连接  */
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    } else {
        
    # 连接成功输出 Socket id
    $i = (int)$msgsock;
    echo "welcome client $i";

        # 向客户端通信(反馈)
        $msg ="连接成功!\n";
        socket_write($msgsock, $msg, strlen($msg));
    }
    socket_close($msgsock);
} while (true);
socket_close($sock);
?>
次に、ターミナル (コマンド ライン) を開き、ファイル ディレクトリを入力して順番に実行します。 ##実行時の効果は次のとおりです:

Note

サーバーがリッスンしているとき、プロセスは一時停止され、他のプロセスは一時停止されません。クライアント ターミナル プログラムを実行するには、別のターミナルを起動する必要がある場合があります。PHPソケットプログラミングで一般的に使用される関数と単純なC/Sインタラクションの実装関連する推奨事項:

PHP と MySql はバックグラウンド データの読み取りをどのように実現しますか? (コード)

thinkphp5 は、ワーカーマン タイマーを使用して定期的にクロールします。サイト コンテンツのコードを取得します。

##

以上がPHPソケットプログラミングで一般的に使用される関数と単純なC/Sインタラクションの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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