ソケット単純な原理とPHPの実装

ソケットは何ですか

ソケット:双方向通信、ソケットなどの接続を介してデータ交換するためのネットワーク接続上の2つのプログラム。

従って、ソケットセット動作は、サーバへのまれな二つの端、クライアント(クライアントS)のいずれかで構成されています。

ソケット作品

ソケットのいくつかの重要な機能

キー機能ソケット1:

      socket_create($ネットパラメータ1、$ストリーム・パラメータ2、$プロトコルパラメータ3)

    役割:ソケットソケットを作成するには、ネットワークのデータストリームです。

    戻り値:ソケット、またはが偽で、パラメータのエラー警告が発行E_WARNING

    それがより明確に言うPHPオンラインマニュアル:

    socket_createを作成し、通信ノードとして知られているソケットを返します。典型的なネットワーク接続は、二つのソケット、クライアント上で実行している、サーバ側の他のランで構成されています。

    パラメータ1は以下のとおりです。ネットワークプロトコル、

    どのようなネットワークプロトコル?これは、次の3つのオプションにあります:

    AF_INET:IPv4ネットワークプロトコル。TCPとUDPは、このプロトコルを使用することができます。一般的にこれを使用し、あなたが知っています。

    AF_INET6:IPv6ネットワークプロトコル。TCPとUDPは、このプロトコルを使用することができます。

    AF_UNIX:ローカルプロトコル。IPCの高性能・低コスト(プロセス間通信)。

    パラメータ2:ソケットストリーム、オプションは次のとおりです。

    SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM。

    ここでは最初の2つだけが説明されています。

    SOCK_STREAM TCPプロトコルのソケット。

    SOCK_DGRAM UDPプロトコルソケット。

    詳細については、こちらをリンクしてくださいます。http://php.net/manual/zh/function.socket-create.php

    パラメータ3:プロトコル契約、オプションは次のとおりです。

    SOL_TCP:TCPプロトコル。

    SOL_UDP:UDPプロトコル。

    ここで分かるように、実際には、第二パラメータと第3のパラメータsocket_create機能が関連しています。

    たとえば、IPv4プロトコルを使用最初の引数場合:AF_INETを、2番目の引数は、TCPソケットのアプリケーションです:SOCK_STREAM、

    そして、三番目のパラメータを使用する必要がありますSOL_TCP

キー機能2:

    socket_connect($ソケットパラメータ1、$のIPパラメータ2、$ポート3つのパラメータ)

    アクション:ソケット接続は、trueまたはfalseを返します

    パラメータ1:socket_create関数の戻り値

    パラメータ2:IPアドレス

    パラメータ3:いいえポート

3主要な機能:

    socket_bind($ソケットパラメータ1、$のIPパラメータ2、$ポート3つのパラメータ)

    アクション:ソケットをバインド、戻り値はtrueまたはfalseであります

       パラメータ1:socket_create関数の戻り値

    パラメータ2:IPアドレス

    パラメータ3:いいえポート

 

キー機能4:

    socket_listen($ソケットパラメータ1、$のbacklogパラメータ2)

    処置:リスニングソケットは、戻り値はtrueまたはfalseであります

    パラメータ1:socket_create関数の戻り値

    パラメータ2:ソケットの最大数はリスニング

キー機能5:

    socket_accept($ソケット)

    役割:ソケットリソース情報、成功したリターン情報資源ソケットを受けるには、falseに失敗しました

        引数:socket_create戻り値

 

キー機能6:

    socket_read($ソケットパラメータ1、$長パラメータ2)

    役割:リソース情報ソケットを読んで、

    戻り値:文字列にソケットリソース情報の成功は、falseに失敗しました

      パラメータ1:socket_createまたは関数の戻り値socket_accept

    文字列の読み取りの長さ:2パラメータ

 

キー機能7:

    socket_write($ソケットパラメータ1、$のMSGパラメータ2、$ STRLEN 3パラメータ)

    効果:データがソケットに書かれています

    戻り値:成功の文字列のバイト長を返し、失敗が偽であります

      パラメータ1:socket_createまたは関数の戻り値socket_accept

    パラメータ2:文字列

    3つのパラメータ:文字列の長さ

 

キー機能8:

    socket_close($ソケット)

    役割は:ソケットを閉じ

    戻り値:成功した場合はtrueを返し、falseに失敗しました

        引数:socket_create戻り値またはsocket_accept

 

    8コア機能は、ここでは、ソケットの関数である2つの比較的重要な機能です

    socket_last_error($ソケット)、パラメータsocket_create戻り値は、最後のエラーコード番号のソケット、ソケットコードの戻り値を取得することです

    socket_strerror($コード)、関数の戻り値はsocket_last_errorのパラメータは、情報取得のコード列は、エラー値はソケットに返されます

 

サーバーサイドスクリプト、server_socket.php

<?PHP
 // ストリームソケットソケットサーバー側を作成し、ネットプロトコルIPv4のプロトコルプロトコルのTCP 
$ソケット = socket_create(AF_INET、SOCK_STREAM、SOL_TCP); 

    / * バインドはストリームソケットのホストとポート、およびクライアントを受け対応する* / 
    IF(socket_bind($ソケット、 '127.0.0.1'、8888)== falseに){
         エコー 'バインドサーバー失敗:' てsocket_strerror(はsocket_last_error());
         / * ここでは127.0.0.1は、ローカルホストでありますあなたが複数のコンピュータを持っている場合、テストは、あなたがIPアドレス書くことができます* / 
    } 
    // リスニングソケットストリームを
    IF(socket_listen($ソケット、4)== ){
         エコー「サーバー失敗を聞きます:」。socket_strerror(()はsocket_last_error); 
    } 
// サーバがクライアント情報の上に無制限のパスを取得することができ
ません{
     / * 情報を介してクライアントのパスを受けた* / 
    $ accept_resource = socket_accept($ソケット);
     / * アクションがsocket_bind socket_acceptを受け入れることです()ソケットストリームを介して送信されたホストにバインドされた* / 

    IF$のaccept_resource!== falseに){
         / * リソースのクライアントが上を通過読んで、そして文字列に* / 
        $文字列 = socket_read($のaccept_resource、1024 );
         / * socket_read機能は、socket_accept()のリソースを読んで、それを文字列に変換することです* / 

        エコー。「受信サーバである:」$文字列値がPHP_EOLある ; // 値は改行定義済みの定数のphpのためPHP_EOLされ
        たIF$文字列 =!falseに){
             $ return_client =「受信サーバーは、次のとおりです。」。$文字列値がPHP_EOLある;
             / * 書き込み情報ソケットストリームsocket_acceptにもフィードバック情報は、()バインドされたホストクライアントsocket_bindすることである* / 
            socket_write($ accept_resource$ return_clientSTRLEN$のreturn_clientを;))
             / * socket_write役割はソケットsocket_createフローに情報を書き込むために、またはsocket_acceptすることです長袖・ストリームの書き込み情報* / 
        } {
             エコー'socket_readが失敗IS' ; 
        } 
    / * socket_close socket_create効果がオフになっている()またはsocket_accept()ソケット確立した流れ* / 
        socket_close($のaccept_resource ); 
    } 
} ながら、真の); 
socket_close($ソケット);

?>

ヒント:実行socket_bindの順序は、socket_listen、三つの機能上のsocket_acceptはつまり、変更することができないことに注意してください

socket_listenを実行し、socket_bindを行い、最終的にsocket_acceptを実行する必要があります

 

クライアント側のスクリプト、client_socket.php

<?PHP
     // ストリームソケットソケットの作成
    $ソケット = socket_create(AF_INET、SOCK_STREAM、SOL_TCPを);
     / * ***************設定されたソケット接続オプションは、これらの2つのステップあなた************省略してもよい* / 
     // マイクロ秒タイムアウトの単位続い受信ソケットストリーム最大タイムアウト1秒が、それはかどうかを示すためにゼロに設定されている 
    (socket_set_option $ソケット、SOL_SOCKET 、SO_RCVTIMEO、アレイ( "SEC" => 1、 "マイクロ秒" => 0。 ));
      // ストリームソケットを送信する6秒最大タイムアウト 
    socket_set_option($ソケット、SOL_SOCKET、SO_SNDTIMEO、アレイ( "SEC" => 。6、 "マイクロ秒" => 0 ));
     / * ***************ソケット接続オプションが提供され、二つのステップは、あなたが省略でき********** ** * / 

    //ソケットストリーム接続サービス側では、このステップは接触を確立するために、ストリームソケットクライアントとサーバーを作ることである
    IF(socket_connect($ソケット、「127.0.0.1」、8888)== ){
         エコー「接続失敗massege:」。さらにsocket_strerror (はsocket_last_error()); 
    } {
         $メッセージ =「こんにちは、ソケット!これはテストです!;
         // GBK符号化、処理ごみ問題に、あなたがあってもよい場合をコーディングに応じて、それぞれの人が異なる符号である
        // $メッセージ= mb_convert_encoding($メッセージ 、」GBK「」UTF-8「)。 
        //文字列の情報がサーバーに書き込まれ

        たIF(socket_write($ソケット$メッセージstrlenを$メッセージは))== falseに){
             エコー「失敗する書き込み」。てsocket_strerrorを(はsocket_last_error()); 

        } {
             エコー「クライアントが成功書く」値がPHP_EOLである;
             // サーバソケットストリーム情報にリードバック
            しばらく$コールバック = socket_read($ソケット、1024 ) ){
                 エコー 'リターンメッセージサーバは、次のとおりです。'。値はPHP_EOLですコールバックを$ ; 
            } 
        } 
    } 
    (socket_close $ソケット); // 作業が完了すると、ソケットストリームをクローズ
 
>?

 

テスト結果

追伸は加えました:

socket_set_option($ソケットパラメータ1、$レベルパラメータ2、$のOPTNAMEパラメータ3、$はoptvalパラメータ4)

この機能は、それはまだ非常に重要な機能である、ソケットセットオプションにデータ・ストリームを返します。

パラメータ1:socket_createまたは関数の戻り値socket_accept

パラメータ2:SOL_SOCKETは、唯一の選択肢であると思われます

パラメータパラメータ3および4は、関連付けられています

パラメータ3は次のようになります。SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO

説明:

SO_REUSEADDRを再び使用することができることができますソケットポートの直後にリリースされました

        このパラメータがある場合は3は、パラメータは、trueまたはfalseです4

SO_RCVTIMEOは最大タイムアウトソケットリソースを受信して​​います

SO_SNDTIMEOは、リソースのソケットに最大タイムアウトを送信しています

  3これらの2つのパラメータ場合、パラメータは、そのようなアレイ4アレイ(「秒」=> 1、「マイクロ秒」=> 500000)であります

  そこに1秒、マイクロ秒の単位は、しかし、アレイタイムアウトが最大時間を設定している同一の効果を有します

 

 

 

おすすめ

転載: www.cnblogs.com/jhy-ocean/p/11425718.html