PHP SOCKET通信

来源:互联网 发布:杭州二手房成交数据 编辑:程序博客网 时间:2024/05/17 04:01

简介

对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 clientServer:hello,I'M clientxxxxx[root@localhost socket]# 

此时Server端也有了输出:

[root@localhost socket]# php server.php Client:hello,I'M clientServer:hello,I'M clientxxxxx

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

0 0