ホームページ  >  記事  >  バックエンド開発  >  PHPでのソケットプログラミングの詳細な例

PHPでのソケットプログラミングの詳細な例

小云云
小云云オリジナル
2018-03-29 11:51:496894ブラウズ

socketプログラミングに関わるネットワークプロトコルについて、TCPああ、UDPああ、socketスリーウェイハンドシェイクなど、これらのネットワークプロトコルは非常に詳細ですオンライン ここでは説明はしませんが、ソケットを確立するプロセスのスクリーンショットを撮っておきます。カットオーバー はい、それをよく見てください。スクリーンショットを盗まれた作者にも感謝の意を表します。パターンを盗用したことをお詫びします。気にしないでください。絵を描くのがめんどくさい(というか絵に自信がないということです笑)。 socketはどのように接続を確立するのでしょうか?上で述べたように、接続を確立するプロセスは、

mysql

のクライアントとサーバー間の接続と本質的に同じです。 mysql

との違いは、

mysqlのサーバーとクライアントが編集されており、それを適用するだけでよいということです。しかし、重大な瞬間が来ました。

socketは私たちに何も提供しません、それが私たちに提供する唯一のものは、何十ものsocket関数です。

その意味するところは、socketprogrammingはサーバーとクライアントを自分で作成する必要があるということです、つまり、「socketprogramming」——は同様のサーバーとクライアントを構築する必要があるということです。 mysqlのアプリケーション。

そういえば聞きたいのですが、このソケットは頭痛を引き起こすと思いますか?適用するためのサーバーもクライアントも確立しません。socket の機能を使用して独自のネットワーク プロトコル ソケット アプリケーションを作成する必要があります。頭痛については何もすることができません。独自のアプリケーションが必要な場合は、やはり socket に対処する必要があります。あはは、これは単なる余談ですので、多くは言いませんが、本題に入りましょう。

socketプログラミングに混乱する前に、まずsocketのいくつかの主要な機能を見て、それぞれの機能を説明したいと思います。そうしないと、socketプログラミングの基本的な知識がない人がこれを読むと、読み終わった後、この記事を思い切って読み飛ばして、socketに対する恐怖症を発症することになると思います。ハハ、もっと言ってよ。

socket1の主な機能:

socket_create($netパラメータ1,$streamパラメータ2,$protocolパラメータ 3)

機能: を作成します。 ソケットソケットという言葉は、率直に言って、ネットワークデータフローです。

戻り値:ソケット、またはfalse、パラメータエラーが発行されます E_WARNING警告

phpのオンラインマニュアルを参照するとより明確になります:

socket_create 通信ノードとも呼ばれるソケットを作成して返します。一般的なネットワーク接続は 2 つの ソケットで構成され、1 つはクライアント側で実行され、もう 1 つはサーバー側で実行されます。

上記の文はphpオンラインマニュアルからコピーしたものです。ここでの意味は、上で繰り返し述べたクライアントとサーバーとまったく同じであることがわかりましたか?ふふ。

パラメータ1は:ネットワークプロトコル、

ネットワークプロトコルとは何ですか?オプションは以下の3つです:

AF_INET IPv4 ネットワークプロトコル。 TCP UDP の両方がこのプロトコルを使用できます。これは一般的に使用されます。

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

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

SOCK_SEQPACKET

SOCK_RAW SOCK_RDM

ここでは最初の 2 つだけを説明します:

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

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

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

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

SOL_TCPTCPプロトコル。

SOL_UDP: UDPプロトコル。

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​実際、socket_create関数の2番目のパラメータと3番目のパラメータは関連していることがわかります。

たとえば、最初のパラメータでIPv4プロトコルを使用する場合: AF_INET、次に2番目のパラメータでTCPソケットを使用する場合: SOCK_STREAM

それでは3 番目のパラメータは SOL_TCP, でなければなりません。これを理解するのは難しくありません。

TCPプロトコルソケット、当然TCPプロトコルしか使えませんよね? UDPソケットを使用する場合、3番目のパラメータの選択方法については説明しません(笑)。

キー関数2

socket_connect($socketparameters1, $ipparameter) 2, $portパラメータ 3)

関数: ソケットを接続、戻り値はtrueまたはfalse

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

パラメータ2 ipAddress

パラメータ3:ポート番号

主な機能3:

socket_bind($socketパラメータ1 ,$ipparameter2,$portparameter3)

関数: ソケットをバインド、戻り値はtrueまたはfalse

パラメータ 1: socket_create

の関数の戻り値

で見られるので 4 s ocket_listen( $socket

parameter

1,$backlog parameter2)

関数: ソケット、戻り値を監視する

true または

false

parameter1 : socket_create

関数の戻り値

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

キー機能 5:

socket_accept($socket)

us in in in in Value

キー関数

6

socket_read($socket パラメータ 1, $lengthパラメータ2) 機能:ソケットリソース情報を読み込み

戻り値:ソケットリソースの文字列情報への変換に成功、失敗は

false

ialgers

関数の戻り値

パラメータ2:読み込んだ文字列の長さ

キー関数7:

socket_write($socketparameter1,$msgparameter2,$strlenparameter3)

機能:ソケットMediumにデータを書き込む

戻り値: 成功時は文字列のバイト長を返す、失敗時はfalse

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

パラメータ 2: 文字列

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

キー関数8

:

socket_close($socket)

機能: ソケットを閉じる

、成功した場合はtrue、成功した場合はfalse

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

これら8つの関数 socketの中核となる関数です。さらに重要な関数が2つあります

socket_last_error($socket)を取得するために使用されるパラメータです。ソケットの最後のエラーコード番号、戻り値ソケットcode socket_strerror($code)、パラメータは

socket_last_errorの文字列情報を取得します。 code、戻り値は Socket error message これらの 2 つの関数は、socket プログラミングにおいて今でも非常に重要であり、

socket プログラミングを書くときは、やはり活用する必要があると思います。特に初心者向けです

デデレーション】 コメントはとても大切です コメントはとても大切です、大事なことは三回叫ぶべきです。

サーバースクリプト、D: vhosttestsocketserver_socket.php



<?php//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);    /*绑定接收的套接流主机和端口,与客户端相对应*/
    if(socket_bind($socket,&#39;127.0.0.1&#39;,8888) == false){        echo &#39;server bind fail:&#39;.socket_strerror(socket_last_error());        /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
    }    //监听套接流
    if(socket_listen($socket,4)==false){        echo &#39;server listen fail:&#39;.socket_strerror(socket_last_error());
    }//让服务器无限获取客户端传过来的信息do{    /*接收客户端传过来的信息*/
    $accept_resource = socket_accept($socket);    /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/

    if($accept_resource !== false){        /*读取客户端传过来的资源,并转化为字符串*/
        $string = socket_read($accept_resource,1024);        /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/

        echo &#39;server receive is :&#39;.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
        if($string != false){            $return_client = &#39;server receive is : &#39;.$string.PHP_EOL;            /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
            socket_write($accept_resource,$return_client,strlen($return_client));            /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
        }else{            echo &#39;socket_read is fail&#39;;
        }    /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
        socket_close($accept_resource);
    }
}while(true);
socket_close($socket);

ヒント: d の実行順序に注意してください。 3つの関数socket_listenとsocket_acceptは変更できません、つまり

最初にsocket_bind、次にsocket_listen、最後にsocket_acceptを実行する必要があります

クライアントスクリプト、D: vhosttestsocketclient_socket.php


<?php    //创建一个socket套接流
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);    /****************设置socket连接选项,这两个步骤你可以省略*************/
     //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));     //发送套接流的最大超时时间为6秒
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));    /****************设置socket连接选项,这两个步骤你可以省略*************/

    //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
    if(socket_connect($socket,'127.0.0.1',8888) == false){        echo 'connect fail massege:'.socket_strerror(socket_last_error());
    }else{        $message = 'l love you 我爱你 socket';        //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
        $message = mb_convert_encoding($message,'GBK','UTF-8');        //向服务端写入字符串信息

        if(socket_write($socket,$message,strlen($message)) == false){            echo 'fail to write'.socket_strerror(socket_last_error());

        }else{            echo 'client write success'.PHP_EOL;            //读取服务端返回来的套接流信息
            while($callback = socket_read($socket,1024)){                echo 'server return message is:'.PHP_EOL.$callback;
            }
        }
    }
    socket_close($socket);//工作完毕,关闭套接流


これら 2 つのスクリプトをテストするにはどうすればよいですか?

以上お願いします注: php の実行名は Windows 環境変数に追加する必要があります。 追加方法がわからない場合は、

php 実行コマンドのディレクトリに入り、絶対コマンドで実行することもできます。 phpコマンドをBaiduの環境変数に設定します

你 これは私の状況です。あなたのファイルアドレスは私とは異なる可能性があります。そうでない場合は、自己責任で操作してください。笑

はすでにソケットプログラミングが必要であると述べました。通信するには、サーバー上の黒いウィンドウを開いたままにする必要があります。

追記:

socket_set_option

($socketparameter1 , $level parameter 2$optname パラメータ 3, $optval parameters4) この関数は、ソケットのデータ フロー オプションを設定するために使用され、非常に重要な関数でもあります。

パラメータ

1: socket_createまたはsocket_accept

パラメータの関数の戻り値2

: SOL_SOCKET、これはあるようです唯一の選択肢

パラメータ3は、パラメータ4に関連付けられています。

パラメータは、SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEOです。

説明:

SO_REUSEADDR ソケットポートを解放後すぐに再使用できるようにするためです

SO_RCVTIMEO はソケットの最大タイムアウトです受信リソースSO_SNDTIMEO はソケットの送信リソース

の最大タイムアウトです これがパラメータ

32の場合、パラメータ4

は次のような配列になります

配列('sec'=>1,'usec'=>500000)

最大タイムアウト時間は配列で設定されますが、一方は秒単位、もう一方はマイクロ秒単位で、効果は同じです

関連する推奨事項:

PHP でのソケットプログラミングの詳細な説明

以上がPHPでのソケットプログラミングの詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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