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实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值