php當(dāng)作客戶端連接websocket服務(wù)

//復(fù)制即可使用 需要注意主機(jī)ip或者域名 端口 路徑是否一致?

$host = '198.126.0.101';

$port = 80;

$path = '/ws';

$key = base64_encode(openssl_random_pseudo_bytes(16));

? ? ? ? $header = "GET $path HTTP/1.1\r\n" .

? ? ? ? ? ? "Host: $host:$port\r\n" .

? ? ? ? ? ? "Upgrade: websocket\r\n" .

? ? ? ? ? ? "Connection: Upgrade\r\n" .

? ? ? ? ? ? "Sec-WebSocket-Key: $key\r\n" .

? ? ? ? ? ? "Sec-WebSocket-Protocol: /ws\r\n".

? ? ? ? ? ? "Sec-WebSocket-Version: 13\r\n\r\n";

? ? ? ? $socket = fsockopen($host, $port, $errno, $errstr, 2);

? ? ? ? if (!$socket)

{

? ? ? ? ? ? die($this->outJsonError(1001,"$errstr ($errno)"));

? ? ? ? }

//? ? ? ? dd($header);

? ? ? ? @fwrite($socket, $header);

? ? ? ? $response = fread($socket, 1500);

//? ? ? ? dd($response);

? ? ? ? if (strpos($response, '101') === false) {

? ? ? ? ? ? die($this->outJsonError(1001,"連接失敗"));

? ? ? ? }

//? ? ? ? echo "連接成功\n";

? ? ? ? $video_device_id = $device_result['video_deviceid'];

? ? ? ? $device_key = $device_result['video_devicekey'];

? ? ? ? $sn = time()* 1000;

// 發(fā)送消息

? ? ? ? $message = 'cmd=publish&topic=test&device_id=test&device_key=test&message={"cmd":3,"pv":0,"sn":"'.$sn.'","msg":{"attr":[120],"data":{"120":'.$is_open.'}}}'.

? ? ? ? ? ? "\r\n\r\n";

? ? ? ? fwrite($socket, web_encode($message));

//? ? ? ? echo "發(fā)送消息: $message\n";

// 接收消息

? ? ? ? $received = web_encode(fread($socket, 1500));

//? ? ? ? echo "收到消息: $received\n";

// 不用則關(guān)閉連接

? ? ? ? fclose($socket);


對(duì)數(shù)據(jù)加解密?


public function web_encode($payload, $type = 'text', $masked = true)

{

? ? $frameHead = [];

? ? $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) {

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

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

? ? ? ? ? ? $frameHead[$i + 2] = ($payloadLength >> (56 - $i * 8)) & 255;

? ? ? ? }

? ? ? ? if ($frameHead[2] > 127) {

? ? ? ? ? ? $frameHead[2] -= 128;

? ? ? ? }

? ? } elseif ($payloadLength > 125) {

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

? ? ? ? $frameHead[2] = ($payloadLength >> 8) & 255;

? ? ? ? $frameHead[3] = $payloadLength & 255;

? ? } else {

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

? ? }

? ? $frame = '';

? ? foreach ($frameHead as $i => $frameHeader) {

? ? ? ? $frame .= chr($frameHeader);

? ? }

? ? if ($masked === true) {

? ? ? ? $mask = [];

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

? ? ? ? ? ? $mask[$i] = mt_rand(0, 255);

? ? ? ? ? ? $frame .= chr($mask[$i]);

? ? ? ? }

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

? ? ? ? ? ? $frame .= chr(ord($payload[$i]) ^ $mask[$i % 4]);

? ? ? ? }

? ? } else {

? ? ? ? $frame .= $payload;

? ? }

? ? return $frame;

}

public? function web_decode($data)

{

? ? $unmaskedPayload = '';

? ? $decodedData = [];

? ? $firstByteBinary = sprintf('%08b', ord($data[0]));

? ? $secondByteBinary = sprintf('%08b', ord($data[1]));

? ? $opcode = bindec(substr($firstByteBinary, 4, 4));

? ? $isMasked = ($secondByteBinary[0] == '1') ? true : false;

? ? $payloadLength = ord($data[1]) & 127;

? ? switch ($opcode) {

? ? ? ? case 1:

? ? ? ? ? ? $decodedData['type'] = 'text';

break;

? ? ? ? case 2:

? ? ? ? ? ? $decodedData['type'] = 'binary';

break;

? ? ? ? case 8:

? ? ? ? ? ? $decodedData['type'] = 'close';

break;

? ? ? ? case 9:

? ? ? ? ? ? $decodedData['type'] = 'ping';

break;

? ? ? ? case 10:

? ? ? ? ? ? $decodedData['type'] = 'pong';

break;

? ? ? ? default:

? ? ? ? ? ? return false;

? ? }

? ? if ($payloadLength === 126) {

? ? ? ? $mask = substr($data, 4, 4);

? ? ? ? $payloadOffset = 8;

? ? ? ? $dataLength = ord($data[2]) << 8 | ord($data[3]);

? ? } elseif ($payloadLength === 127) {

? ? ? ? $mask = substr($data, 10, 4);

? ? ? ? $payloadOffset = 14;

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

? ? ? ? ? ? $dataLength |= (ord($data[$i + 2]) << (7 - $i) * 8);

? ? ? ? }

? ? } else {

? ? ? ? $mask = substr($data, 2, 4);

? ? ? ? $payloadOffset = 6;

? ? ? ? $dataLength = $payloadLength;

? ? }

? ? if ($isMasked === true) {

? ? ? ? for ($i = $payloadOffset; $i < $dataLength + $payloadOffset; $i++) {

? ? ? ? ? ? $j = $i - $payloadOffset;

? ? ? ? ? ? $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];

? ? ? ? }

? ? } else {

? ? ? ? $unmaskedPayload = substr($data, $payloadOffset);

? ? }

? ? $decodedData['payload'] = $unmaskedPayload;

? ? return $decodedData['payload'];

}




響應(yīng):

x
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容