ホームページ >バックエンド開発 >PHPチュートリアル >phpの詳細な説明と分析例socket_PHPチュートリアル

phpの詳細な説明と分析例socket_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:07:06984ブラウズ

この章では、魅力的でわかりにくいソケットについて学びます。ソケットは、PHP ではあまり活用されていない機能です。今日は、クライアント接続を使用できるサーバーを生成し、クライアント上のソケットを使用して接続する方法を説明します。サーバーは詳細な処理情報をクライアントに送信します。
完全なソケットプロセスが表示されたら、それを将来のプログラム開発に使用します。サーバーは接続を可能にする HTTP サーバーであり、クライアントは Web ブラウザーです。これは単一のクライアント/サーバーの関係です。

◆ ソケットの基本
PHPは、Berkleyのソケットライブラリを使用して接続を作成します。ソケットは単なるデータ構造であることがわかります。このソケット データ構造を使用して、クライアントとサーバー間のセッションを開始します。このサーバーは常にリッスンし、新しいセッションを生成する準備をしています。クライアントがサーバーに接続すると、サーバーがセッションを待機しているポートが開きます。このとき、サーバーはクライアントの接続要求を受け入れ、サイクルを実行します。これで、クライアントはサーバーに情報を送信できるようになり、サーバーもクライアントに情報を送信できるようになります。
ソケットを生成するには、プロトコル、ソケット タイプ、パブリック プロトコル タイプの 3 つの変数が必要です。ソケットを生成するときに選択できるプロトコルは 3 つあります。詳細なプロトコルの内容については、以下を読み続けてください。
パブリック プロトコル タイプの定義は、接続に不可欠な要素です。以下の表では、一般的なプロトコルの種類を示します。

表 1: プロトコル
名前/定数の説明
AF_INET これは、送信に TCP または UDP を使用してソケットを生成するために使用されるほとんどのプロトコルであり、IPv4 アドレスで使用されます
AF_INET6 は上記と似ていますが、IPv6 で使用されますアドレス
AF_UNIX ローカル プロトコル。Unix および Linux システムで使用されます。これは、通常、クライアントとサーバーが同じマシン上にある場合に使用されます。

名前/定数の説明 SOCK_STREAM。プロトコルは、シーケンシャルで信頼性の高い、データ統合されたバイト ストリーム ベースの接続です。これは最も一般的に使用されるソケットのタイプです。このソケットは送信に TCP を使用します。
SOCK_DGRAM このプロトコルは、コネクションレス型の固定長の転送呼び出しです。このプロトコルは信頼性が低く、接続に UDP を使用します。
SOCK_SEQPACKET このプロトコルは、固定長のデータ パケットを送信して送信するデュアルラインの信頼性の高い接続です。このパッケージを読み取る前に、完全に受け入れる必要があります。
SOCK_RAW このソケット タイプは、ICMP パブリック プロトコルを使用して単一のネットワーク アクセスを提供します。 (ping とtraceroute はこのプロトコルを使用します)
SOCK_RDM このタイプはめったに使用されず、ほとんどのオペレーティング システムでは実装されていません。これはデータ リンク層に提供され、データ パケットの順序を保証しません。

表 3: パブリックプロトコル

名前/定数の説明

ICMP インターネット制御メッセージプロトコル、主にゲートウェイとホストでネットワーク状態を確認し、エラーメッセージを報告するために使用されますUDP ユーザーデータメッセージプロトコル、コネクションレスで信頼性の低い送信プロトコルです
TCP 送信制御プロトコル。これは、送信プロセス中にエラーが発生した場合に、データ パケットが受信者に確実に届くようにするためのプロトコルです。

ソケットを生成する 3 つの要素がわかったので、PHP のsocket_create() 関数を使用してソケットを生成します。このsocket_create()関数には、プロトコル、ソケットタイプ、パブリックプロトコルの3つのパラメータが必要です。 socket_create() 関数は、成功した場合はソケットを含むリソース タイプを返し、失敗した場合は false を返します。
リソースソケット_create(int プロトコル, int ソケットタイプ, int commonProtocol);

ソケットを生成したら、その後はどうなるでしょうか? PHP には、ソケットを操作するための関数がいくつか用意されています。ソケットを IP にバインドし、ソケットの通信をリッスンし、ソケットを受け入れることができます。次に、関数がソケットを生成、受け入れ、リッスンする方法を理解するための例を見てみましょう。


コードを次のようにコピーします:


& lt ;? PHP

$ COMMONPROTOCOL = GetProtobyname ("TCP"); $ Socket = Socket_Create (AF_INET, Sock_Stream, $ CommonProtocol); , 1337);socket_listen($socket);// さらにソケット機能が追加される予定です?>

上記の例では、独自のサーバー側を生成します。例の最初の行、
$commonProtocol = getprotobyname("tcp");
パブリック プロトコル名を使用してプロトコル タイプを取得します。ここでは TCP パブリック プロトコルが使用されます。UDP または ICMP プロトコルを使用する場合は、getprotobyname() 関数のパラメータを「udp」または「icmp」に変更する必要があります。もう 1 つの方法は、getprotobyname() 関数を使用する代わりに、socket_create() 関数で SOL_TCP または SOL_UDP を指定することです。
$socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP);
例の 2 行目はソケットを生成し、ソケット リソースのインスタンスを返します。ソケット リソースのインスタンスを取得したら、ソケットを IP アドレスとポートにバインドする必要があります。
socket_bind($socket, ‘localhost’, 1337);
ここでは、ソケットをローカル コンピューター (127.0.0.1) にバインドし、ソケットを 1337 ポートにバインドします。次に、すべての受信ソケット接続をリッスンする必要があります。
socket_listen($socket);
4 行目以降は、すべてのソケット関数とその使用法を理解する必要があります。

表 4: ソケット関数
関数名の説明
socket_accept() はソケット接続を受け入れます
socket_bind() はソケットを IP アドレスとポートにバインドします
socket_clear_error() はソケット エラーまたは最後のエラー コードをクリアします
ソケット_クローズ( ) ソケットリソースを閉じます
socket_connect() はソケット接続を開始します
socket_create_listen() は指定されたポートでリッスンするソケットを開きます
socket_create_pair() は区別できないソケットのペアを配列に生成します
socket_create() はソケットを生成しますソケット データ構造体
socket_get_option() ソケット オプションを取得します
socket_getpeername() リモートの同様のホストの IP アドレスを取得します
socket_getsockname() ローカル ソケットの IP アドレスを取得します
socket_iovec_add() 新しいベクトルを分散/集約配列に追加します
socket_iovec_alloc() この関数は、送信、受信、読み取り、書き込みができる iovec データ構造を作成します
socket_iovec_delete() は、割り当てられた iovec を削除します
socket_iovec_fetch() は、指定された iovec リソースのデータを返します
socket_iovec_free() は、iovec リソースを解放します
socket_ iovec_set ( ) iovec データの新しい値を設定します
socket_last_error() 現在のソケットの最後のエラー コードを取得します
socket_listen() 指定されたソケットからのすべての接続をリッスンします
socket_read() 指定された長さのデータを読み取ります
socket_readv() 読み取り分散/集約配列からの受信データ
socket_recv() ソケットからキャッシュへのデータを終了します
socket_recvfrom() 指定されたソケットからデータを受け取ります。指定されていない場合、現在のソケットがデフォルトになります
socket_recvmsg() iovec からメッセージを受信します
socket_select( ) 複数選択
socket_send() この関数は、接続されているソケットにデータを送信します
socket_sendmsg() ソケットにメッセージを送信します
socket_sendto() 指定されたアドレスのソケットにメッセージを送信します
socket_set_block() ソケットをブロックモードに設定します
socket_set_nonblock() ソケットを非ブロックモードに設定します
socket_set_option() ソケットオプションを設定します
socket_shutdown() この関数を使用すると、読み取り、書き込み、または指定されたソケットを閉じることができます
socket_strerror() 指定されたエラー番号を持つ詳細なエラーを返します
socket_write () ソケットキャッシュにデータを書き込みます
socket_writev() データを分散/集約配列に書き込みます

(注:関数紹介は原文の一部を削除しています。関数の詳しい使い方は英語の原文を参照するか、PHPのマニュアルを参照することをお勧めします)
上記の関数はすべてPHPのソケットに関するものです。これらの関数を使用するには、ソケットが開いています。まだ開いていない場合は、php.ini ファイルを編集して、次の行の前のコメントを削除してください:
extension=php_sockets.dll
コメントを削除できない場合は、次のコードを使用してコメントをロードしてください。 拡張ライブラリ:

コードをコピー コードは次のとおりです:

if(!extension_loaded('sockets' ))
{
if(strtoupper(substr(PHP_OS, 3)) == "WIN ”)
{
dl('php_sockets.dll');
}
else
{
dl('sockets.so');
}
}
?>

ソケットが開いているかどうかがわからない場合は、phpinfo() 関数を使用してソケットが開いているかどうかを判断できます。ソケットが開いているかどうかは、phpinfo 情報を確認することで確認できます。以下に示すように:
ソケットに関する phpinfo() 情報を表示する

◆ サーバーを生成します
それでは、最初の例を改良してみましょう。特定のソケットをリッスンし、ユーザー接続を処理する必要があります。

コードをコピーします コードは次のとおりです:

$commonProtocol = getprotobyname("tcp");
$socket =ソケット_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket) ;
// サーバーへの受信接続を受け入れます
$connection =ソケット_accept($socket);
if($connection)
{
socket_write($connection, "ソケットに接続しました...nr");
}
?>

この例を実行するには、コマンド プロンプトを使用する必要があります。その理由は、ここでは Web ページではなくサーバーが生成されるためです。 Web ブラウザを使用してこのスクリプトを実行しようとすると、30 秒の制限を超える可能性が高くなります。以下のコードを使用して無限の実行時間を設定できますが、コマンド プロンプトを使用して実行することをお勧めします。
set_time_limit(0);
コマンド プロンプトでこのスクリプトをテストしてください:
Php.exe example01_server.php
システムの環境変数パスに php インタープリターが設定されていない場合は、 php.exe への詳細なパスを指定する必要があります。サーバーを実行するときは、Telnet 経由でポート 1337 に接続してサーバーをテストできます。以下に示すように:

上記のサーバー側には 3 つの問題があります:
1. 複数の接続を受け入れることができません。
2. 1 つのコマンドだけで完了します。
3. Web ブラウザーからこのサーバーに接続することはできません。
この最初の問題は解決するのが簡単です
。アプリケーションを使用して毎回サーバーに接続できます。しかし、次の問題は、Web ページを使用してサーバーに接続する必要があることですが、これはさらに困難です。サーバーに接続を受け入れさせ、クライアントにデータを書き込み (書き込む必要がある場合)、接続を閉じて次の接続を待つことができます。
前のコードを改良し、次のコードを生成して新しいサーバーを作成します:

コードをコピーします コードは次のとおりです:

// ソケットを設定します
$ commonProtocol = getprotobyname("tcp");
$socket =ソケット_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// バッファを初期化します
$buffer = "データなし";
while(true)
{
// このソケットで受信するすべての接続を受け入れます

$connection =socket_accept($socket);
printf("Socket Connectedrn");
// バッファーに何かがあるかどうかを確認します
if($buffer != "")
{
printf("何かがあるバッファ内...データを送信中...rn");
socket_write($connection, $buffer . "rn");
printf("socketrn に書き込みました");
}
else
{
printf("いいえバッファ内のデータrn");
}
// 入力を取得します
while($data =socket_read($connection, 1024, PHP_NORMAL_READ))
{
$buffer = $data;
socket_write($connection, "Information Receivedrn" );
printf("バッファ: " . $buffer . "rn");
}
socket_close($connection);
printf("ソケットを閉じましたrnrn");
}
?>


このサーバーは何をすべきですか?ソケットを初期化し、データを送受信するためにキャッシュを開きます。接続を待機し、接続が確立されると、サーバー側の画面に「ソケットが接続されました」と表示されます。このサーバーはバッファをチェックし、バッファ内にデータがある場合は、接続されているコンピュータにデータを送信します。次に、このデータに対する受け入れメッセージを送信し、メッセージを受け入れると、メッセージをデータに保存し、接続されているコンピュータにメッセージを認識させ、最後に接続を閉じます。接続が閉じられると、サーバーは次の接続の処理を開始します。 (間違った翻訳、原文を添付しました)
これがサーバーの動作であり、データの受信と送信に使用するソケットとバッファーを初期化し、接続が作成されると、「ソケットが接続されました。」と表示されます。 」をサーバーが実行されている画面に送信します。サーバーは、
バッファーに何かがあるかどうかを確認し、存在する場合は、接続されているコンピューターにデータを送信します。
データを送信した後、情報の受信を待ちます。情報を受信すると
それをデータに保存し、接続されているコンピューターに情報を受信したことを通知し、
接続を閉じた後、サーバーは
プロセス全体を再度開始します。

◆ 2番目の問題を処理するクライアント
を生成するのは簡単です。 PHP ページを生成し、ソケットに接続し、データをそのキャッシュに送信して処理する必要があります。データを再度処理した後、データをサーバーに送信できます。別のクライアント接続では、そのデータが処理されます。
2 番目の問題を解決するには、
ソケットに接続する PHP ページを作成し、バッファー内のデータを受信し、
バッファー内のデータを処理した後、それを処理する必要があります。別のクライアントが接続すると、送信したデータが処理され、クライアントはさらにデータをサーバーに送り返します。
次の例は、ソケットの使用方法を示しています:

コードをコピーします

コードは次のとおりです:// ソケットを作成して接続します
$socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP);
$ connection =ソケット_connect($socket,'localhost', 1337);
while($buffer =socket_read($socket, 1024, PHP_NORMAL_READ))
{
if($buffer == "データなし")
{
echo("

NO DATA

");
break;
}
else
{
// バッファ内のデータを使って何かを行う
echo("

Buffer Data: " . $buffer . “

”);
}
}
echo(“

ソケットへの書き込み

”);
// テストデータをソケットに書き込みます
if(!socket_write ($socket, “ SOME DATArn"))
{
echo("

書き込み失敗

");
}
// ソケットからの応答を読み取ります
while($buffer =ソケット_read($socket , 1024, PHP_NORMAL_READ) )
{
echo(“

送信されたデータ: SOME DATA
応答:” . $buffer . “

”);
}
echo(“< p>Done Reading from Socket

”);
?>


このコード例は、クライアントがサーバーに接続する例を示しています。クライアントはデータを読み取ります。これがこのサイクルで到着する最初の接続である場合、サーバーは「NO DATA」をクライアントに送り返します。これが発生した場合、クライアントは接続の最上位にあります。クライアントはデータをサーバーに送信し、データはサーバーに送信され、クライアントは応答を待ちます。応答を受信すると、応答を画面に書き込みます。



http://www.bkjia.com/PHPjc/327568.html

www.bkjia.com

http://www.bkjia.com/PHPjc/327568.html技術記事この章では、ソケットの魅力的かつ複雑な世界について学びます。ソケットは、PHP ではあまり活用されていない機能です。今日は、動作するクライアントの作成を見ていきます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。