PHPネットワークプログラミングでは、 Socket_*シリーズ関数は、基礎となるネットワーク通信機能を開発者に提供します。 Stream_Socket_*シリーズ関数はより高度で使いやすいですが、 Socket_*は、基礎となる制御要件が高くなっているいくつかのシナリオでは、かけがえのない利点があります。この記事では、基礎となるソケットをsocket_export_streamを介してストリームに変換する方法を紹介し、それによりクライアントとサーバーの間の双方向通信メカニズムを実現します。
socket_export_streamは、基礎となるソケットリソースをストリームリソースとしてエクスポートするためにPHPが提供する関数であるため、 fread()やfwrite()などの馴染みのあるファイルフロー関数を使用してソケットデータを操作できます。このアプローチは、基礎となるソケットの柔軟性と、ストリームAPIの使いやすさを組み合わせています。
stream socket_export_stream(Socket $socket): resource|false
FOPEN 、 Stream_Select 、 fgetsなどの関数と組み合わせて動作するために使用できるタイプストリームのリソースを返します。
サーバーは、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";
サーバーは、クライアント接続要求をブロックして待機し、接続リソースを読み取り可能なストリームと書き込み可能なストリームにエクスポートします。
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);
}
また、クライアントは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_Select 、 Stream_set_blockingなどの関数で使用できます。
双方向のコミュニケーションは自然でスムーズです。リアルタイムの応答は、ループの読み取りと書き込みを通じて達成できます。
socket_export_streamは、接続されたソケットにのみ使用できます。
使用後、リソースの漏れを防ぐために、ストリームとソケットを閉じる必要があります。
ネットワーク通信は、ブロッキングやクラッシュを避けるために、例外処理とタイムアウト制御を検討する必要があります。