网上的代码大都是官方的例子,不直观、不彻底。 结合网上的东西花了一周的时间。
这是一篇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);