详解详解PHP中中websocket的使用方法的使用方法
主要为大家详细介绍了PHP中websocket的使用方法,为大家进行了详细注解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
关于PHP中websocket使用的详细注解,供大家参考。
服务端:
<?php
//send用户加入
//send1发送信息
//send2退出登录
error_reporting(E_ALL ^ E_NOTICE);
ob_implicit_flush();
//file_put_contents('lz.text','123', FILE_APPEND);
$sk=new Sock('127.0.0.1',8000);
$sk->run();
class Sock{
public $sockets;
public $users;
public $master;
private $sda=array();//已接收的数据
private $slen=array();//数据总长度
private $sjen=array();//接收数据的长度
private $ar=array();//加密key
private $n=array();
public function __construct($address, $port){
$this->master=$this->WebSocket($address, $port);//resource(2, Socket) //服务器监听
var_dump("master:");
var_dump($this->master);
$this->sockets=array($this->master);//array (size=1) 0 => resource(2, Socket) 。运行两个php还是这样
//var_dump($this->sockets);
//file_put_contents('lz.text',var_dump($this->sockets), FILE_APPEND);
}
function run(){
while(true){
$changes=$this->sockets;//$changes由多变1,但$this->sockets却只是稳定的+1;
$write=NULL;
$except=NULL;
//1.运行select()系统调用在给定阵列插座与指定的超时
//2.没有接收到数据就会一直处于阻塞状态,
//3.若没有client过来,直阻塞进程,直到有client访问,返回1。
//4.此时返回的changes,不是曾经的changes。虽然还只是一条记录,但已经不是服务器而是客户端
/*select的特殊作用:!!!!!!!
初始为array(0=>resource(2, Socket))
1,初始状态返回为array(0=>resource(2, Socket))。但socket_accept可以得到resource(3, Socket)
2,初始状态返回为array(0=>resource(2, Socket),1=>resource(3,Socket))。
客户来的客户为resource(3,Socket)。则返回的数据为resource(3,Socket).!!!
*/
var_dump($changes);
$rr=socket_select($changes,$write,$except,NULL);
var_dump($changes);
var_dump("---*---");
//exit;
/*
file_put_contents('lz.text',json_encode($changes), FILE_APPEND);
file_put_contents('lz.text','-----', FILE_APPEND);*/
foreach($changes as $sock){
//连接主机的client
//$this->master永远是 resource(2, Socket)。相当于一个缓存。两种情况,1:为空,使进程阻塞。2:存刚接收的client。
if($sock==$this->master){ //---此处只用来存数据了
//在socket套接字已创建使用socket_create(),必将与socket_bind()名字,告诉听连接socket_listen(),这个函数将接受传入的连接,插座。
//一旦成功连接,将返回一个!!新的套接字资源!!,该资源可用于通信。如果套接字上有多个连接,则第一个将被使用。
//如果没有挂起的连接,socket_accept()将阻塞直到连接成为现在。如果使用了非阻塞套接字已socket_set_blocking()或socket_set_nonblock(),错误将返回。
//返回socket_accept()插座资源不得用于接受新的连接。原来的听插座插座,但是,仍然是开放的,可以重复使用。
$client=socket_accept($this->master); //resource(3, Socket)。表示接受请求,并创建一个子链接!!
//var_dump($client);
//exit;
$key=uniqid();
$this->sockets[]=$client;
$this->users[$key]=array(
'socket'=>$client,
'shou'=>false
);
/*
array (size=1)
'57d607085f92a' => //$key
array (size=2)
'socket' => resource(3, Socket) //$socket的表现都一样,只有通过$key区分
'shou' => boolean false
*/
// file_put_contents('lz.text',json_encode($this->users), FILE_APPEND);
}else{ //---此处服务器与客户端发信息
$len=0;
$buffer='';
do{
/*
int socket_recv ( resource socket, string &buf, int len, int flags )
resource socket 是生成的套接字
string &buf 是接收缓冲区
int len 是你打算接收的长度
int flags 是一个标志
0x1 数据应该带外发送,所谓带外数据就是TCP紧急数据
0x2 使有用的数据复制到缓冲区内,但并不从系统缓冲区内删除。
0x4 不要将包路由出去。
评论0
最新资源