ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットプログラミングの簡単な理解
この記事は主に php ソケット プログラミングの簡単な理解を紹介します。
php プログラミングは比較的難しいものです。理解していますが、 socket のいくつかの機能とそれらが果たす役割の関係を理解している限り、実際、 socket プログラミングを理解するのは難しいことではありません。ネットワークサービスのクライアントとサーバーを確立することです。これは mysql のクライアントとサーバーが何であるかを理解するだけで済みます。これから私がこれから言おうとしていることが理解できるはずです。 ソケットプログラミングに関わるネットワークプロトコルについて、TCPああ、
UDPああ、ソケットスリーウェイハンドシェイクなど、多くのネットワークがありますここでは詳しい説明はしませんが、ソケットを確立するプロセスのスクリーンショットを撮っておきます。そこから盗んでください。同時に、スクリーンショットもよく見てください。スクリーンショットを盗まれた作者にも感謝の意を表します。パターンを盗用したことをお詫びします。気にしないでください。絵を描くのがめんどくさい(というか絵に自信がないということです笑)。 socketはどのように接続を確立するのでしょうか?上で述べたように、接続を確立するプロセスは、mysqlのクライアントとサーバー間の接続と本質的に同じです。 mysqlとの違いは、mysqlのサーバーとクライアントが編集されており、それを適用するだけでよいということです。しかし、重大な瞬間が来ました。socketは私たちに何も提供しません、それが私たちに提供する唯一のものは、何十ものsocket関数です。 取り扱い >> mysqlと同様のサーバーおよびクライアントアプリケーションを構築します。 そういえば聞きたいのですが、このソケットは頭痛を引き起こすと思いますか?適用するサーバーもクライアントも作成しません。socket の機能を使用して独自のネットワーク プロトコル ソケット アプリケーションを作成する必要があります。頭痛の種を解決する方法はありません。独自のアプリケーションが必要な場合でも、 socketに対処する必要があります。あはは、これは単なる余談ですので、多くは言いませんが、本題に入りましょう。 socketプログラミングに混乱する前に、まずsocketのいくつかの主要な機能を見て、それぞれの機能を説明したいと思います。そうしないと、socketプログラミングの基本的な知識がない人がこれを読むと、読み終わった後、この記事を思い切って読み飛ばして、socketに対する恐怖症を発症することになると思います。ハハ、もっと言ってよ。 キー関数1、$streamを介してログします 2、$protocolパラメータ3) 関数: ソケットソケットワードを作成するのは、端的に言えば、ネットワークデータフローです。 、パラメーターエラーが発行されますe_warningwarning socket_create 通信ノードとも呼ばれるソケットを作成して返します。一般的なネットワーク接続は 2 つの ソケットで構成され、1 つはクライアント側で実行され、もう 1 つはサーバー側で実行されます。 上記の文はphpオンラインマニュアルからコピーしたものです。ここでの意味は、上で繰り返し述べたクライアントとサーバーとまったく同じであることがわかりましたか?ふふ。ネットワークプロトコルとは何ですか?オプションは以下の3つです: AF_INET: IPv4 TCP UDP の両方がこのプロトコルを使用できます。これは一般的に使用されます。 AF_INET6: IPv6 ネットワークプロトコル。 TCP UDP の両方がこのプロトコルを使用できます。 AF_UNIX: ローカル通信プロトコル。高性能かつ低コストのIPC (プロセス間通信)。 in in in in\\ SOCK_SEQPACKET SOCK_RAW SOCK_RDM。 TCP プロトコルソケット経由。 SOCK_DGRAM プロトコルソケット。 詳細については、こちらのリンクをご覧ください: http://php.net/manual/zh/function.socket-create.php パラメータ3: protocolプロトコル、オプションは: SOL_TCP: TCPプロトコル。 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 関数の戻り値
キー関数3: socket_bind($socketparameter1,$ipparameter2,$portparameter 3) 関数: ソケットをバインドします。戻り値は true または false パラメータ 1: socket_create パラメータ2 : ipAddress パラメータ3: ポート番号 キー関数4: socket_listen($socketパラメータ1, $ バックログ パラメータ2) 関数: ソケットをリッスン、戻り値はtrueまたはfalse パラメータ1: socket_create の戻り値 パラメータ2:待ち受けソケットの最大数
キー関数5: socket_accept($socket) 機能:ソケットのリソース情報を受信ソケットの戻り値は成功、失敗はfalse パラメータ:socket_create の関数戻り値 キー関数6 : socket_read( $socket パラメータ 1, $length パラメータ 2) 機能: ソケットのリソース情報を読み込みます 戻り値:ソケットリソースの文字列情報への変換に成功、失敗はfalse パラメータ1:socket_createまたはsocket_accept関数の戻り値 パラメータ2:長さ文字列の読み取り キー関数7: msgparameter2 , パラメータ3) 関数: ソケットにデータを書き込みます falseを返します パラメータ1: socket_createまたはsocket_accept の関数の戻り値 パラメータ2:文字列 パラメータ3:文字列の長さ 主な機能 8: socket_close($socket) 関数: ソケットを閉じる socket_create または socket_accept 関数の戻り値 これらの 8 つの関数は Socket のコア関数です. より重要な 2 つの関数を以下に示します。socket_create の戻り値は、ソケットの最後のエラー コード番号を取得するために使用されます。 socket_strerror($code)、パラメータはsocket_last_error関数の戻り値、codeの文字列情報を取得、戻り値はソケットエラー情報 これsocketプログラミングにおいて、この関数は依然として非常に重要です。特に初心者にとっては、それを活用する必要があると思います。 以下はコードです。注意してください。コメントは非常に重要です。 サーバースクリプト、D:vhosttestsocketserver_socket.php ヒント: 上記のsocket_bind、socket_listen、socket_acceptに注意してください 3つの関数の実行順序は変更できません。つまり、socket_bindは最初に実行され、次にsocket_listen、最後にsocket_accept 客户端脚本,D:\vhost\test\socket\client_socket.php 怎么测试这两个脚本呢? 首先打开windows的dos窗口,就是cmd黑窗口,然后,运行php D:\vhost\test\socket\server_socket.php, 让服务端的的黑窗口持续运行的, 其次,php的客户端脚本可以通过浏览器运行,也可以再开一个cmd黑窗口运行 php D:\vhost\test\socket\client_socket.php 在这里请注意:php这个运行命名必须加入windows的环境变量中,假如不知道怎么加, 请进入php运行命令目录用绝对命令运行,也可以百度把php命令加入环境变量中 这里是我的情况,你的文件地址可能和我不一样,请按照你的地址情况来操作,否则,后果自负,呵呵 上面已经说过了,socket编程必须要有服务端才能交流,所以服务端的黑窗口是必须让它持续开着的。 追記: socket_set_option($socketparameter1 , $level parameter2) 、$optname パラメータ3 , $optval parameters4) この関数はソケットのデータフローオプションを設定するために使用され、非常に重要な関数でもあります。 パラメータ1: socket_createまたはsocket_accept パラメータの関数の戻り値2 : SOL_SOCKET、これはあるようです唯一のオプション パラメータ3はパラメータ4、に関連しています パラメータ3は: SO_REUSEADDR SO_RCVTIMEO 解放後すぐに再度使用できます がこれであれば、パラメータ4 はにすることができます本当 または falseSO_RCVTIMEO はソケットの受信リソースの最大タイムアウトです SO_SNDTIMEO はソケットの送信リソースの最大タイムアウトです パラメータ3がこれら 2 つの場合、パラメーター 4 は次のような配列になります array('sec'=> 1,'usec'=>500000) タイムアウトを設定するための最大時間は配列に設定されていますが、一方は秒単位、もう一方はマイクロ秒単位であり、効果は同じです 関連する推奨事項: <?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);//工作完毕,关闭套接流
パラメータ
以上がPHPソケットプログラミングの簡単な理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。