PHP 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(读取时,遇到\n或\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()函数的参数来获取到文字描述的错误信息。
*/

实例

模仿一个Server端与Client端进行通信的过程,需要有一个Server端,一个Client端。
Server端持续运行,等待接受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\n"; $retbuf = $info . "xxxxx";//作为返回响应的信息 echo "Server:$retbuf\n"; $ret = socket_write($skt_act, $retbuf); }

Client端建立到Server端的连接,向Server端发送信息并接收Server端返回的信息。

<?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 "\nServer:$retMsg\n";

先运行Server端,此时Server端会进入等待接受连接的状态:

[root@localhost socket]# php server.php 

然后运行Client端,建立到Server端的连接并发生&接收信息:

[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

通过示例可以看到,Server端在运行后,一直处于等待连接的状态,而当Client端运行后,向Server端发起了连接,并传送了信息到Server端,Server端在收到Client端传送来的信息之后,对信息进行了加工,然后将加工后的信息返回给Client端,Client端接收到Server端的返回信息后将其打印输出,这是一个比较简单的socket实现。

你可能感兴趣的:(PHP,socket,unix)