PHP SOCKET通信
概要
Unix Cに詳しい人は、その中にもsocketネットワークソケットがあることを知っているはずです.ネットワーク通信を実現するために使われています.PHPのsocketは似ていると思います.まず、PHPのsocket操作に関するいくつかの一般的な関数を見てみましょう.
≪インスタンス|Instance|emdw≫
1つのサーバ側とClient側が通信するプロセスを模倣するには、1つのサーバ側、1つのClient側が必要です.サーバ側は継続的に動作し、クライアント側の接続を受信して応答情報を返すのを待つ.
Client側はサーバ側への接続を確立し、サーバ側に情報を送信し、サーバ側から返された情報を受信する.
まず、サーバー側を実行します.サーバー側は接続を受け入れるのを待つ状態になります.
次にClient側を実行し、サーバ側への接続を確立し、情報を発生&受信します.
この時点で、Server側にも出力があります.
例から分かるように、サーバー側は実行後、ずっと接続待ちの状態であり、Client側が実行した後、サーバー側に接続を開始し、サーバー側に情報を伝達し、サーバー側はClient側から伝達された情報を受け取った後、情報を加工し、加工した情報をClient側に返し、Client側はサーバ側の戻り情報を受信して印刷出力し,比較的簡単なsocket実装である.
Unix Cに詳しい人は、その中にもsocketネットワークソケットがあることを知っているはずです.ネットワーク通信を実現するために使われています.PHPのsocketは似ていると思います.まず、PHPのsocket操作に関するいくつかの一般的な関数を見てみましょう.
resource socket_create ( int $domain , int $type , int $protocol )
/*
1、 : socket , , FALSE;
2、 :
$domain: , AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNIX( );
$type: , SOCK_STREAM( 、 、 、 、 ,TCP )、SOCK_DGRAM( , , ,UDP )、SOCK_SEQPACKET( 、 、 、 、 )、SOCK_RAW、SOCK_RDM;
$protocol: $domain , SOL_TCP(TCP )、SOL_UDP(UDP )。
*/
bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
/*
1、 : socket , TRUE, FALSE;
2、 :
$socket: socket_create() ;
$address: , , ;
$port: 。
*/
bool socket_listen ( resource $socket [, int $backlog = 0 ] )
/*
1、 : socket , SOCK_STREAM SOCK_SEQPACKET, TRUE, FALSE;
2、 :
$socket: socket_create() ;
$backlog: , Linux Windows ,Linux , “sysctl -a | grep somaxconn” , centos7.0 128(net.core.somaxconn = 128)。
*/
resource socket_accept ( resource $socket )
/*
1、 : socket , socket , FALSE;
2、 :
$socket: socket_create() ;
*/
bool socket_connect ( resource $socket , string $address [, int $port = 0 ] )
/*
1、 : , TRUE, FALSE;
2、 :
$socket: socket_create() ;
$address: server , socket (AF_INET\AF_INET6\AF_UNIX) , , socket AF_INET, IP ;
$port: server , AF_INET AF_INET6 。
*/
string socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
/*
1、 : socket , , FALSE;
2、 :
$socket: socket_create() ;
$length: ;
$type: , , PHP_BINARY_READ( , , recv() )、PHP_NORMAL_READ( ,
\r )。
*/
int socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
/*
1、 : socket , , FALSE;
2、 :
$socket: socket_create() ;
$buffer: ;
$length: socket , , 。
*/
int socket_last_error ([ resource $socket ] )
string socket_strerror ( int $errno )
/*
1、 : 2 ,socket_last_error() socket , socket_strerror() socket , socket_last_error() , socket_strerror() 。
*/
≪インスタンス|Instance|emdw≫
1つのサーバ側とClient側が通信するプロセスを模倣するには、1つのサーバ側、1つのClient側が必要です.サーバ側は継続的に動作し、クライアント側の接続を受信して応答情報を返すのを待つ.
<?php /* * Server socket, Client socket * @Author:LiangJL * @Time:2015/12/6 */ const BIND_ERROR = 5; const LISTEN_ERROR = 6; const ACCEPT_ERROR = 7; const BUFFER_SIZE = 1024; // socket $skt = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // $ret = socket_bind($skt, '127.0.0.1', 7588); if ($ret == false) { $errorCode = socket_last_error(); $errorMsg = socket_strerror($errorCode); echo $errorMsg; exit(BIND_ERROR); } // $ret = socket_listen($skt); if ($ret == false) { $errorCode = socket_last_error(); $errorMsg = socket_strerror($errorCode); echo $errorMsg; exit(LISTEN_ERROR); } // while (true) { $skt_act = socket_accept($skt); if ($skt_act == false) { $errorCode = socket_last_error(); $errorMsg = socket_strerror($errorCode); echo $errorMsg; exit(ACCEPT_ERROR); } $info = socket_read($skt_act, BUFFER_SIZE); if ($info === false) { ; // error } echo "Client:$info
"; $retbuf = $info . "xxxxx";// echo "Server:$retbuf
"; $ret = socket_write($skt_act, $retbuf); }
Client側はサーバ側への接続を確立し、サーバ側に情報を送信し、サーバ側から返された情報を受信する.
<?php /* * Client socket, * @Author:LiangJL * @Time:2015/12/6 */ // $skt = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($skt == false) { ; // error } // Server $ret = socket_connect($skt, '127.0.0.1', 7588); if ($ret == false) { ; // error } // $msg = "hello,I'M client"; echo "Client:$msg"; $ret = socket_write($skt, $msg); if ($ret === false) { ; // error } // Server $retMsg = socket_read($skt, 1024); echo "
Server:$retMsg
";
まず、サーバー側を実行します.サーバー側は接続を受け入れるのを待つ状態になります.
[root@localhost socket]# php server.php
次にClient側を実行し、サーバ側への接続を確立し、情報を発生&受信します.
[root@localhost socket]# php client.php
Client:hello,I'M client Server:hello,I'M clientxxxxx
[root@localhost socket]#
この時点で、Server側にも出力があります.
[root@localhost socket]# php server.php
Client:hello,I'M client Server:hello,I'M clientxxxxx
例から分かるように、サーバー側は実行後、ずっと接続待ちの状態であり、Client側が実行した後、サーバー側に接続を開始し、サーバー側に情報を伝達し、サーバー側はClient側から伝達された情報を受け取った後、情報を加工し、加工した情報をClient側に返し、Client側はサーバ側の戻り情報を受信して印刷出力し,比較的簡単なsocket実装である.