婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP實現WebSocket實例詳解

PHP實現WebSocket實例詳解

熱門標簽:合肥ai電銷機器人費用 400電話個人能不能辦理 溫州外呼系統招商 銀行信貸電話機器人 滄州電銷外呼系統價格 天津電銷外呼系統違法嗎 凱立德地鐵站地圖標注 手機外呼系統什么原理 上海400客服電話怎么申請

WebSocket 是什么?

摘抄網上的一些解釋:

WebSocket 協議是基于 TCP 的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發送信息給客戶端。

WebSocket 通信協議于2011年被 IETF 定為標準 RFC 6455,并被 RFC7936 所補充規范。

—— 百度百科

WebSocket 是一個持久化的協議,這是相對于 http 非持久化來說的。

舉個簡單的例子,http1.0 的生命周期是以 request 作為界定的,也就是一個 request,一個 response,對于 http 來說,本次 client 與 server 的會話到此結束;而在 http1.1 中,稍微有所改進,即添加了 keep-alive,也就是在一個 http 連接中可以進行多個 request 請求和多個 response 接受操作。然而在實時通信中,并沒有多大的作用,http 只能由 client 發起請求,server 才能返回信息,即 server 不能主動向 client 推送信息,無法滿足實時通信的要求。而 WebSocket 可以進行持久化連接,即 client 只需進行一次握手,成功后即可持續進行數據通信,值得關注的是 WebSocket 實現 client 與 server 之間全雙工通信,即 server 端有數據更新時可以主動推送給 client 端。

上圖是一個演示client和server之間建立WebSocket連接時握手部分

client 建立 WebSocket 時向服務器端請求的信息

GET /chat HTTP/1.1 
  Host: server.example.com 
  Upgrade: websocket //告訴服務器現在發送的是WebSocket協議
  Connection: Upgrade 
  Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一個Base64 encode的值,這個是瀏覽器隨機生成的,用于驗證服務器端返回數據是否是WebSocket助理
  Sec-WebSocket-Protocol: chat, superchat 
  Sec-WebSocket-Version: 13 
  Origin: http://example.com

服務器獲取到 client 請求的信息后,根據 WebSocket 協議對數據進行處理并返回,其中要對 Sec-WebSocket-Key 進行加密等操作

HTTP/1.1 101 Switching Protocols 
  Upgrade: websocket //依然是固定的,告訴客戶端即將升級的是Websocket協議,而不是mozillasocket,lurnarsocket或者shitsocket
  Connection: Upgrade 
  Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //這個則是經過服務器確認,并且加密過后的 Sec-WebSocket-Key,也就是client要求建立WebSocket驗證的憑證
  Sec-WebSocket-Protocol: chat

PHP 服務端

?php

if(($socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))  0) {
    echo "socket_create() 失敗的原因是:".socket_strerror($sock)."\n";
}
if(($ret = socket_bind($socket,'127.0.0.1','9090'))  0) {
    echo "socket_bind() 失敗的原因是:".socket_strerror($ret)."\n";
}
if(($ret = socket_listen($socket,3))  0) {
    echo "socket_listen() 失敗的原因是:".socket_strerror($ret)."\n";
}

$all_sockets = [$socket];    // socket 集合

do {
    $copy_sockets = $all_sockets;   // 單獨拷貝一份

    // 因為客戶端是長連接,如果客戶端非正常斷開,服務端會在 socket_accept 阻塞,現在使用 select 非阻塞模式 socket
    if(socket_select($copy_sockets, $write, $except, 0) === false)
        exit('sosket_select error!');

    // 接收第一次 socket 連入,連入后移除服務端 socket
    if(in_array($socket, $copy_sockets)) {
        $client = socket_accept($socket);
        if($client) {
            $buf = socket_read($client, 1024);
            echo $buf;

            // 匹配 Sec-Websocket-Key 標識
            if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/i",$buf,$match)) {
                // 需要將 Sec-WebSocket-Key 值累加字符串,并依次進行 SHA-1 加密和 base64 加密
                $key = base64_encode(sha1($match[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));
                // 拼湊響應內容
                $res= "HTTP/1.1 101 Switching Protocol".PHP_EOL
                    ."Upgrade: WebSocket".PHP_EOL
                    ."Connection: Upgrade".PHP_EOL
                    ."WebSocket-Location: ws://127.0.0.1:9090".PHP_EOL
                    ."Sec-WebSocket-Accept: " . $key .PHP_EOL.PHP_EOL;  // 注意這里,需要兩個換行
                // 向客戶端應答 Sec-WebSocket-Accept
                socket_write($client, $res, strlen($res));
                // 向客戶端發送消息
                socket_write($client, buildMsg('socket ok'), 1024);

                // 加入客戶端 socket
                $all_sockets[] = $client;
            }
            // 移除服務端 socket
            $key = array_search($socket, $copy_sockets);
            unset($copy_sockets[$key]);

            // socket_close($client);
        }
    }

    // 循環所有客戶端 sockets
    foreach ($copy_sockets as $s) {
        // 獲取客戶端發給服務端的內容
        $buf = socket_read($s, 8024);
        echo strlen($buf).'---'.PHP_EOL;
        // 代表客戶端主動關閉
        if(strlen($buf)  9) {
            $key = array_search($s, $all_sockets);
            unset($all_sockets[$key]);
            socket_close($s);
            continue;
        }
        // 輸出
        echo getMsg($buf).PHP_EOL;
    }

}while(true);
socket_close($socket);

// 編碼服務端向客戶端發送的內容
function buildMsg($msg) {
    $frame = [];
    $frame[0] = '81';
    $len = strlen($msg);
    if ($len  126) {
        $frame[1] = $len  16 ? '0' . dechex($len) : dechex($len);
    } else if ($len  65025) {
        $s = dechex($len);
        $frame[1] = '7e' . str_repeat('0', 4 - strlen($s)) . $s;
    } else {
        $s = dechex($len);
        $frame[1] = '7f' . str_repeat('0', 16 - strlen($s)) . $s;
    }
    $data = '';
    $l = strlen($msg);
    for ($i = 0; $i  $l; $i++) {
        $data .= dechex(ord($msg{$i}));
    }
    $frame[2] = $data;
    $data = implode('', $frame);
    return pack("H*", $data);
}

// 解析客戶端向服務端發送的內容
function getMsg($buffer) {
    $res = '';
    $len = ord($buffer[1])  127;
    if ($len === 126) {
        $masks = substr($buffer, 4, 4);
        $data = substr($buffer, 8);
    } else if ($len === 127) {
        $masks = substr($buffer, 10, 4);
        $data = substr($buffer, 14);
    } else {
        $masks = substr($buffer, 2, 4);
        $data = substr($buffer, 6);
    }
    for ($index = 0; $index  strlen($data); $index++) {
        $res .= $data[$index] ^ $masks[$index % 4];
    }
    return $res;
}

客戶端

!DOCTYPE html>
html lang="en">
head>
    meta charset="UTF-8">
    title>Title/title>
    script>
        // 創建一個Socket實例
        var socket = new WebSocket('ws://localhost:9090');

        // 打開Socket
        socket.onopen = function(event) {
            // 發送一個初始化消息
            socket.send("init msg");

        };
        socket.onmessage = function(event) {
            console.log('收到消息',event);

        };

        // 監聽Socket的關閉
        socket.onclose = function(event) {
            console.log('關閉監聽',event);
        };

        function  send()
        {
            socket.send("client msg");
        }
    /script>
/head>
body>
button onclick="send()">發送消息/button>
/body>
/html>

運行測試:

Client

Server

到此這篇關于PHP實現WebSocket實例詳解的文章就介紹到這了,更多相關PHP實現WebSocket內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • php+websocket 實現的聊天室功能詳解
  • PHP 實現 WebSocket 協議原理與應用詳解
  • PHP框架實現WebSocket在線聊天通訊系統
  • PHP用swoole+websocket和redis實現web一對一聊天
  • ThinkPHP5.0框架結合Swoole開發實現WebSocket在線聊天案例詳解
  • PHP實現websocket通信的方法示例
  • php redis 處理websocket聊天記錄的實例代碼

標簽:七臺河 溫州 金華 酒泉 洛陽 赤峰 怒江 白城

巨人網絡通訊聲明:本文標題《PHP實現WebSocket實例詳解》,本文關鍵詞  PHP,實現,WebSocket,實例,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP實現WebSocket實例詳解》相關的同類信息!
  • 本頁收集關于PHP實現WebSocket實例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91在线一区二区三区| 国产乱妇无码大片在线观看| 看国产成人h片视频| 91高清视频在线| 中文字幕日韩av资源站| 成人午夜在线播放| 亚洲视频香蕉人妖| 色悠悠久久综合| 一区二区三区日韩欧美精品| 91视频你懂的| 亚洲一区二区三区四区五区黄| 色吊一区二区三区| 日韩精品一级二级| 精品久久五月天| 美女视频黄 久久| 久久日一线二线三线suv| 国产69精品久久久久777| 国产精品久久久久久久第一福利| 国产精品一线二线三线| 国产精品美女久久久久av爽李琼 | 亚洲国产精品久久人人爱蜜臀| 99久久精品国产一区二区三区| 亚洲卡通动漫在线| 欧美一区日韩一区| 国产99久久久国产精品潘金| 136国产福利精品导航| 欧美日韩精品综合在线| 国产高清久久久久| 午夜精品久久久久久久久久| 精品国产伦一区二区三区观看方式| 国产精品一区不卡| 五月天精品一区二区三区| 久久色.com| 欧美日韩一区高清| 成人激情午夜影院| 亚洲电影在线播放| 欧美国产综合色视频| 欧美精品乱码久久久久久按摩| 国产成人啪免费观看软件| 亚洲国产欧美一区二区三区丁香婷| 久久婷婷一区二区三区| 欧美三级电影网| 成年人网站91| 国产专区欧美精品| 依依成人精品视频| 中文字幕巨乱亚洲| 日韩欧美激情四射| 欧美午夜片在线观看| 国产一区二区不卡老阿姨| 亚洲一区二区3| 亚洲欧美在线另类| 天天综合天天综合色| 精品捆绑美女sm三区| 欧美日本一道本| 97精品久久久久中文字幕 | 91蜜桃在线观看| 奇米在线7777在线精品| 亚洲成精国产精品女| 一区二区在线看| 国产精品国产a| 国产网红主播福利一区二区| 2024国产精品| 欧美成人高清电影在线| 欧美一区二区三区视频在线 | 日韩精品一区二区三区老鸭窝| 欧美性猛交xxxxxxxx| 在线观看亚洲a| 在线亚洲人成电影网站色www| av电影在线观看一区| av电影在线观看一区| 91看片淫黄大片一级| 欧美专区在线观看一区| 欧美性大战久久久久久久| 欧美日韩中文另类| 欧美美女黄视频| 欧美精品乱码久久久久久按摩| 欧美日韩不卡在线| 日韩欧美一级二级三级久久久| 日韩一区二区三免费高清| 欧美成人bangbros| 中文字幕不卡一区| 亚洲天天做日日做天天谢日日欢 | 在线国产电影不卡| 欧美午夜一区二区三区| 日韩一区二区中文字幕| 久久久夜色精品亚洲| 国产精品午夜春色av| 亚洲视频电影在线| 午夜一区二区三区在线观看| 精品在线观看视频| 99久久精品国产导航| 91精品欧美福利在线观看| 久久精品亚洲一区二区三区浴池 | 6080午夜不卡| 亚洲影院免费观看| 美腿丝袜亚洲三区| 波多野结衣一区二区三区| 欧美色窝79yyyycom| 欧美大胆人体bbbb| 亚洲欧美偷拍三级| 日韩成人免费在线| 成人福利在线看| 3atv一区二区三区| 欧美激情艳妇裸体舞| 日韩激情中文字幕| 成人av网站在线| 日韩欧美视频一区| 亚洲日本电影在线| 国产精品综合视频| 欧美日韩1234| 亚洲日本va在线观看| 精品写真视频在线观看| 在线视频欧美精品| 亚洲欧洲另类国产综合| 久久66热偷产精品| 欧美视频在线播放| 国产精品久久久久一区二区三区| 麻豆精品久久精品色综合| 欧美系列在线观看| 亚洲欧洲日本在线| 成人免费高清视频| 久久精品亚洲一区二区三区浴池| 日本美女一区二区三区视频| 91国偷自产一区二区使用方法| 国产欧美一区二区精品婷婷| 另类人妖一区二区av| 777午夜精品视频在线播放| 亚洲免费观看高清在线观看| 成人免费黄色大片| 久久蜜桃一区二区| 久久精品国产久精国产爱| 欧美久久免费观看| 亚洲成a人v欧美综合天堂下载 | 国产精品沙发午睡系列990531| 免费视频最近日韩| 69堂成人精品免费视频| 蜜臀av性久久久久蜜臀aⅴ| 国产一区二区三区黄视频| 日韩视频中午一区| 美腿丝袜亚洲三区| 国产精品美女久久久久aⅴ | 日本一区二区电影| 欧美亚洲日本一区| 国产一区二区三区观看| 国产成人8x视频一区二区| 成人免费一区二区三区在线观看| 欧美精选午夜久久久乱码6080| 国产成人午夜99999| 三级精品在线观看| 亚洲欧美偷拍另类a∨色屁股| 日韩欧美一级二级三级| 91蝌蚪国产九色| 国产91丝袜在线18| 美女在线观看视频一区二区| 中文字幕亚洲在| 久久久久国产精品麻豆| 91精品国产丝袜白色高跟鞋| 91看片淫黄大片一级在线观看| 精彩视频一区二区| 亚洲伊人伊色伊影伊综合网 | 自拍偷拍亚洲激情| 欧美xxxx在线观看| 欧洲一区二区av| 国产成人av资源| 国产在线精品国自产拍免费| 伊人性伊人情综合网| 中文字幕一区二区三区四区| 欧美一区二区三区喷汁尤物| 在线亚洲精品福利网址导航| 91捆绑美女网站| 成人免费观看视频| 顶级嫩模精品视频在线看| 国产成人免费在线观看| 国产精品一级黄| 人妖欧美一区二区| 亚洲成人av在线电影| 亚洲午夜免费视频| 亚洲电影你懂得| 三级欧美韩日大片在线看| 午夜a成v人精品| 免费成人在线网站| 精彩视频一区二区三区| 国产不卡视频在线播放| 国产**成人网毛片九色 | 亚洲国产成人va在线观看天堂| 国产精品毛片高清在线完整版| 国产欧美一区二区精品秋霞影院| 国产午夜精品在线观看| 国产精品久久久久久久久免费丝袜 | 国产精品视频免费| 国产精品久久久久婷婷| 国产精品的网站| 国产精品久久久久久久久动漫 | 欧美视频一区在线观看| 欧美一级夜夜爽| 久久综合色一综合色88| 欧美极品xxx| 亚洲久本草在线中文字幕| 午夜精品久久久| 欧美日韩国产综合草草|