php 多路复用_php之sockets多用户同时访问之io多路复用实现原理!

server.php服务器端(务必看注释)

$address = "0.0.0.0";

$port = 8089;

// Create a TCP Stream socket

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($socket, $address, $port) or die('Could not bind to address');

socket_listen($socket);

#把所有的链接状态的socket(非活跃数据socket)加入到队列中!

$comn_sockets[] = $socket;

$write = null;

$except = null;

while (true){

#这里必须拷贝一份$comn_sockets,因为socket_select函数是数组引用传参,会改变$copy_sockets的值!

#PHP中的数组赋值是值拷贝,但是socket_select ( array &$read , array &$write , array &$except) 是引用地址!

$copy_sockets = $comn_sockets;

socket_select($copy_sockets, $write, $except, 0);

foreach ($copy_sockets as $res_socket) {

if ($res_socket === $socket) {

#这里是把不活跃的socket通过挂起函数返回一个新的$new_socket,然后把新的$new_socket添加到原始链接队列$comn_sockets中!

$new_socket = socket_accept($res_socket);

socket_write($new_socket, "恭喜你和服务器已经链接成功!!!") . "\n";

echo socket_read($new_socket, 1024) . "\n";

$comn_sockets[] = $new_socket;

} else {

#已经链接成功且活跃的新$new_socket再一次发送请求(一次链接,永久双向传输)

var_dump($res_socket);

socket_write($res_socket, "服务器返回给你的数据如下:") . "\n";

echo socket_read($res_socket, 1024) . "\n";

}

}

}

?>

clent.php客户端(socke_read函数会持续等待,所以先屏蔽了)

$address = "127.0.0.1";

$port = 8089;

// Create a TCP Stream socket

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($socket, $address, $port);

#客户端的读会卡死,所以在测试和服务器多用户写的时候,暂时屏蔽了!

// $result = socket_read($socket, 1024);

// echo "客户端接收到的数据为${result}";

while (true){

fwrite(STDOUT, '请输入内容');

$msg = trim(fgets(STDIN));

socket_write($socket, $msg, 1024);

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值