PHP SOCKET通信

12638 ワード

概要
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、      :      socketsocket    ,     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: ; $lengthsocket , , 。 */ 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実装である.