この記事の内容は、php ソケット プログラミングでよく使用される関数と、単純な c/s インタラクションの実装についてです。内容は非常に詳細です。必要な友人は参照してください。お役に立てれば幸いです。
ソケットの公式説明:
ネットワーク プログラミングで最も一般的に使用されるソリューションは、クライアント/サーバー (クライアント/サーバー) モデルです。このシナリオでは、クライアント アプリケーションがサーバー プログラムにサービスを要求します。サービス プログラムは通常、既知のアドレスでサービスへのリクエストをリッスンします。つまり、クライアントがサービスのアドレスへの接続リクエストを行うまで、サービス プロセスは休止状態のままになります。この時点で、サービス プログラムは「起動」され、クライアントの要求に適切に反応してクライアントにサービスを提供します。このクライアント/サーバー モデルのネットワーク プログラミングを容易にするために、1990 年代初頭に Microsoft と他の数社が共同で WINDOWS の下で一連のネットワーク プログラミング インターフェイス、つまり Windows Sockets 仕様を開発しました。プログラミング インターフェイス: 複数のプロトコルをサポートする Windows 上の一連のオープン ネットワーク プログラミング インターフェイス。 Winsock は基本的にプロトコルに依存しなくなり、Winsock を使用して複数のプロトコルの関数を呼び出すことができますが、TCP/IP プロトコルがより一般的に使用されます。 Socket は実際には、Socket インターフェイスを持つ任意のコンピュータと通信できる通信ポートをコンピュータに提供します。アプリケーションはネットワーク上で送信し、受信した情報はこの Socket インターフェイスを通じて実現されます。
Socket は、ネットワーク上のさまざまなコンピューター アプリケーションを接続し、大量のデータを転送できるパイプとして単純に理解できます。パイプの端を投げ込むと、パイプの B 端から出てきます (C、D、E、F... 端から出ることもできます)。
#Note: さまざまなコンテキストでソケットを変更するためにさまざまな単語を使用します。ソケット自体には実際の意味がないため、概念だけを理解する必要があります。エンティティ
関数プロトタイプ:
resourceソケット_create (int $domain, int $type, int $protocol)次の 3 つのパラメータが含まれています:
の定義は address family
、address Familyつまり、一般的に ipv4、ipv6
です。これは、TCP プロトコルで使用されるタイプでもあります
boolソケット_バインド(リソース $ socket, string $ address [, int $port = 0 ] )これには、次の 3 つのパラメータが含まれます:
作成されたソケットリソースは、ソケットに対応する ID とみなすことができます
bool socket_listen (resource $socket [ , int $backlog = 0 ] )これには、次の 2 つのパラメータが含まれます:
ソケット リソース
resourcesocket_accept ( resource $socket )
を使用して作成されたソケット リソース
intソケット_ライト (リソース $socket, string $buffer [ , int $length])
resource
リソースに書き込まれる buffer
の長さを制御します (長さが異なる場合)。 buffer
の容量を超えているため、buffer
の容量を使用します
TODO: 送信されたデータを取得する
関数プロトタイプ: intソケット_read (resource $socket, int $length)
socket: socket_create
length: socket
リソース内の buffer# を使用して作成されたソケット リソース##長さ
関数プロトタイプ:
voidソケット_クローズ (リソース $socket)
または socket_create
によって生成されたリソースは、stream
リソース を閉じるために使用できません。
関数プロトタイプ:
resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )
server.php を次のように編集します。 ## 次に、クライアント プログラム
client.php を次のように編集します。
<?php date_default_timezone_set("Asia/Shanghai"); error_reporting(E_NOTICE ); /* 确保在连接客户端时不会超时 */ set_time_limit(0); $ip = '127.0.0.1'; $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('Y-m-d H:i:s') . PHP_EOL; echo "Listening at ".$ip.':'.$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); ?>
サーバーがリッスンしているとき、プロセスは一時停止され、他のプロセスは一時停止されません。クライアント ターミナル プログラムを実行するには、別のターミナルを起動する必要がある場合があります。関連する推奨事項:
PHP と MySql はバックグラウンド データの読み取りをどのように実現しますか? (コード)
##
以上がPHPソケットプログラミングで一般的に使用される関数と単純なC/Sインタラクションの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。