php服务器主动通知网页客户端,PHP 之phpsocket.io客户端主动推送给服务器

一、效果图

997269e51004143662e02893d12f44d0.png

250bf53b4b00a719010c0f3eb83834e9.png

二、代码

1、客户端

class SocketIO

{

public function send($host = null, $port = null, $action = "message", $data = null, $address = "/socket.io/?EIO=2", $transport = 'websocket')

{

$fd = fsockopen($host, $port, $errno, $errstr);

if (!$fd) {

return false;

} //Can't connect tot server

$key = $this->generateKey();

$out = "GET $address&transport=$transport HTTP/1.1\r\n";

$out .= "Host: http://$host:$port\r\n";

$out .= "Upgrade: WebSocket\r\n";

$out .= "Connection: Upgrade\r\n";

$out .= "Sec-WebSocket-Key: $key\r\n";

$out .= "Sec-WebSocket-Version: 13\r\n";

$out .= "Origin: *\r\n\r\n";

fwrite($fd, $out);

// 101 switching protocols, see if echoes key

$result = fread($fd, 10000);

preg_match('#Sec-WebSocket-Accept:\s(.*)$#mU', $result, $matches);

$keyAccept = trim($matches[1]);

$expectedResonse = base64_encode(pack('H*', sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));

$handshaked = ($keyAccept === $expectedResonse) ? true : false;

if ($handshaked) {

if ($action){

fwrite($fd, $this->hybi10Encode('42["' . $action . '", "' . addslashes($data) . '"]'));

}else{

fwrite($fd, $this->hybi10Encode(addslashes($data)));

}

fwrite($fd, $this->hybi10Encode(addslashes($data)));

$content = '';

while (!feof($fd)) {

stream_set_timeout($fd, 1);

$content .= fread($fd, 1024);

$info = stream_get_meta_data($fd);

if ($info['timed_out']) {

break;

}

}

//fread($fd,1000000);

fclose($fd);

return true;

} else {

return false;

}

}

private function generateKey($length = 16)

{

$c = 0;

$tmp = '';

while ($c++ * 16 < $length) {

$tmp .= md5(mt_rand(), true);

}

return base64_encode(substr($tmp, 0, $length));

}

private function hybi10Encode($payload, $type = 'text', $masked = true)

{

$frameHead = array();

$payloadLength = strlen($payload);

switch ($type) {

case 'text':

$frameHead[0] = 129;

break;

case 'close':

$frameHead[0] = 136;

break;

case 'ping':

$frameHead[0] = 137;

break;

case 'pong':

$frameHead[0] = 138;

break;

}

if ($payloadLength > 65535) {

$payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);

$frameHead[1] = ($masked === true) ? 255 : 127;

for ($i = 0; $i < 8; $i++) {

$frameHead[$i + 2] = bindec($payloadLengthBin[$i]);

}

if ($frameHead[2] > 127) {

$this->close(1004);

return false;

}

} elseif ($payloadLength > 125) {

$payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);

$frameHead[1] = ($masked === true) ? 254 : 126;

$frameHead[2] = bindec($payloadLengthBin[0]);

$frameHead[3] = bindec($payloadLengthBin[1]);

} else {

$frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;

}

foreach (array_keys($frameHead) as $i) {

$frameHead[$i] = chr($frameHead[$i]);

}

if ($masked === true) {

$mask = array();

for ($i = 0; $i < 4; $i++) {

$mask[$i] = chr(rand(0, 255));

}

$frameHead = array_merge($frameHead, $mask);

}

$frame = implode('', $frameHead);

for ($i = 0; $i < $payloadLength; $i++) {

$frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];

}

return $frame;

}

}

$socket = new SocketIO();

$result = $socket->send('localhost', 2021,'broadcast', json_encode(['id'=>'1','name'=>'name_ '.date('Y-m-d H:i:s')]));

var_dump($result);die;

2、服务端(采用phpsocket.io)

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

use PHPSocketIO\SocketIO;

$io = new SocketIO(2021);

// 当有客户端连接时打印一行文字

$io->on('connection', function($connection)use($io){

echo "new connection coming\n";

$connection->on('broadcast', function($msg)use($io){

var_dump(json_decode($msg));

});

});

Worker::runAll();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值