php 纯socket编程核心的东西!socket_read阻塞的问题! while loop 失败!彻底搞清楚php socket的socket_read、socket_recv

网上的代码大都是官方的例子,不直观、不彻底。 结合网上的东西花了一周的时间。
这是一篇socket应用级别的文章,更深入的了解(自己写的):

最大视角-从Unix底层 理解 python的io模型、python异步IO、python的select、Unix的select、epoll
fileno 的本质:可读写文件
一图了解 socket原理
Python 标准输入输出

通常:一些简单的概念结合在一起就变得混乱

重点:
1、阻塞就是,没有按照PHP的思维习惯,在莫名其妙的请款下就停止了【阻塞】,阻塞的本质是在底层操作系统、网络接口等用c语言封装后暴露出来的一个PHP函数(看c的socket总结出来的)
2、socket_accept、socket_read、socket_recv默认都会阻塞,但也可以用socket_set_nonblock()、socket_set_block()设置
3、PHP不关心buffer缓存,在这:
socket_read的buffer=n 意思是:最多读取n个字符(注意编码),和while结合就有点懵逼了:每满n个字符就输出
socket_write的$buffer=n 意思是: 最多写入n个字符
4、socket 很大程度受限于操作系统(即 和操作系统紧密相关)

一图了解

在这里插入图片描述
在这里插入图片描述

用到的代码(最简单的才容易理解)

<?php
$socket_create = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket_create, '127.0.0.1', 13145);
socket_listen($socket_create,4);
// socket_set_nonblock($socket_create);	//错误的地方
error_reporting(E_ERROR );
while (true){	//while 是抄来的所以不懂得 使用的原因	//关系到socket_close要不要运行,什么时候运行(需要更进一步研究)
    print_r("暂停\n");
    $socket_accept = socket_accept($socket_create);
    print_r("继续\n");
/**********************************************************************************read研究开始 两者注释一个*/
   //  socket_set_nonblock($socket_accept);
    
   // while(($buf_read_data = socket_read($socket_accept, 2, PHP_BINARY_READ)) !== false){//PHP_NORMAL_READ 不够length就阻塞,PHP_BINARY_READ不会
   //     var_dump($buf_read_data."\n");
   // }
/**********************************************************************************read研究 结束 */
/**********************************************************************************recv研究开始 两者注释一个*/
    socket_set_nonblock($socket_accept);	
    // //socket_read、socket_recv、socket_accept三个默认都是阻塞的,不阻塞就是:不会'卡死'在这些函数上
    //不开启不能反向写入数据:报错:Warning: socket_recv(): unable to read from socket [0]: ����ɹ���ɡ�
    //如果不开启的话就是同步,同步在此意思是:此处socket和client的socket是同一个socket,客户端的socket sleep几秒,这里也sleep几秒。最终因为网速慢于电脑,所以客户端接受不到这里write的数据,client的while就运行完了
   	while ($flag = socket_recv($socket_accept, $buf, 2, 0)) {
   		var_dump($flag);
   	}
   	var_dump($flag);
/**********************************************************************************recv研究 结束*/   
    print_r("读完了\n");
// sleep(1);	//这里是没用的,请看client
	$write_data = socket_write($socket_accept, 'aaaaaaaaaaa',1024);//写数据的时候buffer无所谓
   	print_r($write_data."\n");
   	print_r("写完了\n");

}
socket_close($socket_accept);
print_r("结束\n");

客户端

<?php
$socket_create = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$socket_connect = socket_connect($socket_create, '127.0.0.1', 13145);
//socket_connect($socket_create, '127.0.0.1', 13145);
socket_set_nonblock($socket_create);	//必须开启  结果:不开启不会结束(socket_close) 原因:未知

//socket_write($socket_create, $aa = "abcdef我", 10);
socket_write($socket_create, $aa = "abcdefe", strlen($aa));
print_r(strlen($aa));
sleep(5);	//机器运算要比网络传输快几百倍,服务器还没有返回数据呢就已经开始运行了,当然就收的是空值了
while ($flag = socket_recv($socket_create, $buf, 2, 0)) {
	var_dump($flag);
}
var_dump($flag);
socket_close($socket_create);

猜你喜欢

转载自blog.csdn.net/thinkthewill/article/details/84841416
今日推荐