socketプログラミングに関わるネットワークプロトコルについて、TCPああ、UDPああ、socketスリーウェイハンドシェイクなど、これらのネットワークプロトコルは非常に詳細ですオンライン ここでは説明はしませんが、ソケットを確立するプロセスのスクリーンショットを撮っておきます。カットオーバー はい、それをよく見てください。スクリーンショットを盗まれた作者にも感謝の意を表します。パターンを盗用したことをお詫びします。気にしないでください。絵を描くのがめんどくさい(というか絵に自信がないということです笑)。 socketはどのように接続を確立するのでしょうか?上で述べたように、接続を確立するプロセスは、
のクライアントとサーバー間の接続と本質的に同じです。 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_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の関数の戻り値 パラメータ2 :ipAddress パラメータ3:ポート番号
主な機能3: socket_bind($socketパラメータ1 ,$ipparameter2,$portparameter3) 関数: ソケットをバインド、戻り値はtrueまたはfalse パラメータ 1: socket_create で見られるので 4: s ocket_listen( $socket 1,$backlog parameter2) true または parameter1 : socket_create パラメータ2: リッスンソケットの最大数 キー機能 5: socket_accept($socket) us in in in in Value キー関数 : socket_read($socket パラメータ 1, $lengthパラメータ2) 機能:ソケットリソース情報を読み込み 戻り値:ソケットリソースの文字列情報への変換に成功、失敗は 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 ヒント: d の実行順序に注意してください。 3つの関数socket_listenとsocket_acceptは変更できません、つまり 最初にsocket_bind、次にsocket_listen、最後にsocket_acceptを実行する必要があります クライアントスクリプト、D: vhosttestsocketclient_socket.php これら 2 つのスクリプトをテストするにはどうすればよいですか? 以上お願いします注: php の実行名は Windows 環境変数に追加する必要があります。 追加方法がわからない場合は、 php 実行コマンドのディレクトリに入り、絶対コマンドで実行することもできます。 phpコマンドをBaiduの環境変数に設定します はすでにソケットプログラミングが必要であると述べました。通信するには、サーバー上の黒いウィンドウを開いたままにする必要があります。
追記: socket_set_option ($socketparameter1 , $level parameter 2、$optname パラメータ 3, $optval parameters4) この関数は、ソケットのデータ フロー オプションを設定するために使用され、非常に重要な関数でもあります。 パラメータ 1: socket_createまたはsocket_accept : SOL_SOCKET、これはあるようです唯一の選択肢 パラメータ3は、パラメータ4に関連付けられています。 パラメータは、SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEOです。 “ SO_RCVTIMEO はソケットの最大タイムアウトです受信リソースSO_SNDTIMEO はソケットの送信リソース 32の場合、パラメータ4 配列('sec'=>1,'usec'=>500000) 最大タイムアウト時間は配列で設定されますが、一方は秒単位、もう一方はマイクロ秒単位で、効果は同じです 関連する推奨事項: <?php//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /*绑定接收的套接流主机和端口,与客户端相对应*/
if(socket_bind($socket,'127.0.0.1',8888) == false){ echo 'server bind fail:'.socket_strerror(socket_last_error()); /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
} //监听套接流
if(socket_listen($socket,4)==false){ echo 'server listen fail:'.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 'server receive is :'.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
if($string != false){ $return_client = 'server receive is : '.$string.PHP_EOL; /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
socket_write($accept_resource,$return_client,strlen($return_client)); /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
}else{ echo 'socket_read is fail';
} /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
socket_close($accept_resource);
}
}while(true);
socket_close($socket);
<?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 サイトの他の関連記事を参照してください。