websocket+php实现前后端实时通信

使用websocket+php实现前后端实时通信,由于发送的文件可能是大文件,
所以本代码对大文件进行了分片发送处理;
由于websocket是应用层协议,即websocket对需要发送的内容进行了封装,
所以,当服务端接收完每一片的内容时需要对接收完的内容进行解码(解封装);
websocket的封装协议可以去百度一下。

server端代码:
<?php
error_reporting(E_ALL ^ E_NOTICE);
set_time_limit(0);
ob_implicit_flush();
//地址与接口,即创建socket时需要服务器的IP和端口
$sk=new Sock('0.0.0.0',4000);//这里表示允许所有ip连接该websocket服务器
//对创建的socket循环进行监听,处理数据
$sk->run();
//下面是sock类
class Sock{
public $sockets; //socket的连接池,即client连接进来的socket标志
public $users; //所有client连接进来的信息,包括socket、client名字等
public $master; //socket的resource,即前期初始化socket时返回的socket资源
public $real_path;//上传文件时获取的文件路径
private $sda=array(); //已接收的数据
private $slen=array(); //数据总长度
private $sjen=array(); //接收数据的长度
private $ar=array(); //加密key
private $n=array();

public function __construct($address, $port){
//创建socket并把保存socket资源在$this->master
$this->master=$this->WebSocket($address, $port);
//创建socket连接池
$this->sockets=array($this->master);
}
//对创建的socket循环进行监听,处理数据
function run(){
$len_content = 0;
//死循环,直到socket断开
while(true){
$changes=$this->sockets;
$write=NULL;
$except=NULL;

socket_select ($changes, $write , $except , NULL);
foreach($changes as $sock){
//如果有新的client连接进来,则
if($sock==$this->master){
//接受一个socket连接
$client=socket_accept($this->master);

//给新连接进来的socket一个唯一的ID
$key=uniqid();
$this->sockets[]=$client; //将新连接进来的socket存进连接池
$this->users[$key]=array(
'socket'=>$client, //记录新连接进来client的socket信息
'shou'=>false //标志该socket资源没有完成握手
);
//否则1.为client断开socket连接,2.client发送信息
}else{

$len=0;
$buffer='';
//读取该socket的信息,注意:第二个参数是引用传参即接收数据,第三个参数是接收数据的长

度
while(($leng = socket_recv($sock,$buf,1024,MSG_DONTWAIT)) > 0){
//此处需要注意MSG_DONTWAIT在部分windows版本的php中可能没有定义所以在接收数据时需要重

新处理
$len+=$leng;
// $buf1 = $buf;
$buffer.=$buf;
$buf = null;
//var_dump($leng);
}
//根据socket在user池里面查找相应的$k,即健ID
$k=$this->search($sock);

//如果接收的信息长度小于7,则该client的socket为断开连接
if($len<7){
//给该client的socket进行断开操作,并在$this->sockets和$this->users里面进行删除
$this->send2($k);
continue;
}
//判断该socket是否已经握手
if(!$this->users[$k]['shou']){
//如果没有握手,则进行握手处理
$this->woshou($k,$buffer);
$buf = null;
}else{
//走到这里就是该client发送信息了,对接受到的信息进行decode解码处理
//
$buffer = $this->decode($buffer);
if($buffer==false){
continue;
}
if ('send_type' == substr($buffer,0,9)){//表示发送的内容是字符串
$this->send($k,$buffer);
continue;
}
if (false !== strpos($buffer, 'filename=')) {
$len_content = 0;
parse_str($buffe
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值