欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Think-Swoole之WebSocket有什么用

這篇文章主要介紹了Think-Swoole之WebSocket有什么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供松山企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為松山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

什么是 WebSocket

WebSocket 協(xié)議是基于 TCP 的一種新的網(wǎng)絡(luò)協(xié)議,使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。

為什么需要 WebSocket

因?yàn)?HTTP 的通信只能由客戶端發(fā)起。

WebSocket有哪些特點(diǎn)

  • 建立在TCP協(xié)議之上的

  • 性能開銷小,通信高效

  • 客戶端可以與任意的服務(wù)器進(jìn)行通信

  • 協(xié)議標(biāo)識(shí):ws、wss

  • 持久化網(wǎng)絡(luò)通信協(xié)議

WebSocket 使用場(chǎng)景

社交聊天、彈幕、多玩家游戲、協(xié)同編輯、股票基金實(shí)時(shí)報(bào)價(jià)、體育實(shí)況更新、視頻會(huì)議聊天、基于位置的應(yīng)用、在線教育等需要高實(shí)時(shí)性的運(yùn)用場(chǎng)景。

在 WebSocket 之前,傳統(tǒng)方式我們想要做聊天程序,可能會(huì)使用 JavaScript 定時(shí)器,每隔一秒鐘發(fā)送一次 HTTP 請(qǐng)求到服務(wù)器,查詢有沒(méi)有新消息。

有了 WebSocket ,客戶端通過(guò)瀏覽器以 HTTP 方式向服務(wù)端發(fā)送 WebSocket 連接請(qǐng)求,然后服務(wù)器發(fā)出回應(yīng),這個(gè)過(guò)程通常稱為“握手” 。瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道,將協(xié)議升級(jí)為 WebSocket,有新消息的話,服務(wù)端主動(dòng)將消息推送給客戶端。

SocketIO 又是什么

WebSocket 是 HTML5 最新提出的規(guī)范,雖然主流瀏覽器都已經(jīng)支持,但仍然可能有不兼容的情況,為了兼容所有瀏覽器,給程序員提供一致的編程體驗(yàn), SocketIO 將 WebSocket 、AJAX 和其它的通信方式全部封裝成了統(tǒng)一的通信接口,也就是說(shuō),我們?cè)谑褂?SocketIO 時(shí),不用擔(dān)心兼容問(wèn)題,底層會(huì)自動(dòng)選用最佳的通信方式。因此說(shuō),WebSocket 是 SocketIO 的一個(gè)子集,Think-Swoole 中是按照 SocketIO 進(jìn)行解析發(fā)送到服務(wù)端的數(shù)據(jù)。

在 ThinkPHP 6 中開啟 WebSocket 服務(wù)

1、配置文件 config/swoole.php 中“websocket. enable”設(shè)置為 true。

2、創(chuàng)建監(jiān)聽事件,創(chuàng)建WsConnect、WsClose、WsTest(這個(gè)可任意命名,和客戶端須對(duì)應(yīng)起來(lái)),在項(xiàng)目根目錄分別輸入如下命令:

php think make:listener WsConnect
php think make:listener WsClose
php think make:listener WsTest

app/listener 目錄下會(huì)生成剛才創(chuàng)建的監(jiān)聽類文件,在對(duì)應(yīng)的事件類中可寫入業(yè)務(wù)邏輯。我們這里先打印 $event 這個(gè)變量。Connect 事件中的 $event 是 app\Request 請(qǐng)求對(duì)象,Test自定義消息接收事件的 $event 是客戶端發(fā)送過(guò)來(lái)的消息。

3、在 app/event.php 中的數(shù)組 listen 鍵中定義事件監(jiān)聽類:

app/event.php
'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        //監(jiān)聽連接,swoole 事件必須以 swoole 開頭
        'swoole.websocket.Connect' => [
            app\listener\WsConnect::class
        ],
        //監(jiān)聽關(guān)閉
        'swoole.websocket.Close' => [
            \app\listener\WsClose::class
        ],
        //監(jiān)聽 Test 場(chǎng)景
        'swoole.websocket.Test' => [
            \app\listener\WsTest::class
        ],
    ],

swoole.websocket.Connect:客戶端與服務(wù)器建立連接并完成握手事件,即 Swoole 中的 onOpen 事件。在這里記錄你自己程序用戶與客戶端的連接ID(fd)等。非必須,建議定義。

swoole.websocket.Close:客戶端連接關(guān)閉事件,非必須。

swoole.websocket.Test:自定義的 Test 事件;用于接收客戶端發(fā)送的 test 事件的消息。一個(gè)項(xiàng)目中可以定義多個(gè) Test 事件,例如聊天、定位、客服功能事件,則可對(duì)應(yīng)為 Test1、Test2、Test3等。

WebSocket 的事件也可以在 config/swoole.php 配置文件的“websocket. listen”進(jìn)行配置:

'listen' => [
    // 首字母大小寫都可以;值應(yīng)該是字符串非數(shù)組
    'connect' => 'app\listener\WsConnect',
    'close'   => 'app\listener\WsClose',
    'test'    => 'app\listener\WsTest'
],

4、項(xiàng)目根目錄開啟服務(wù):php think swoole start 即可,底層會(huì)自動(dòng)判斷當(dāng)前請(qǐng)求是 HTTP 還是 WebSocket。

客戶端與服務(wù)端建立連接

現(xiàn)在我們做一個(gè) HTML 頁(yè)面,通過(guò) HTML5 WebSocket 向我們的服務(wù)器端建立連接。在任意地方新建 test.html,內(nèi)容如下:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

消息:<input type="text" id="message">
接收者:<input type="text" id="to">
<button onclick="send()">發(fā)送</button>
<script>
    var ws = new WebSocket("ws://127.0.0.1:9501/");
    ws.onopen = function(){
        console.log('連接成功');
    }
    ws.onmessage = function(data){
        console.log(data);
    }
    ws.onclose = function(){
        console.log('連接斷開');
    }
    function send()
{
        var message = document.getElementById('message').value;
        var to = document.getElementById('to').value;
        console.log("準(zhǔn)備給" + to + "發(fā)送數(shù)據(jù):" + message);
        ws.send(JSON.stringify(['test',{
            //這里可以自己定義屬性
            to:to,
            message:message
        }])); //發(fā)送的數(shù)據(jù)必須是 "['test',數(shù)據(jù)]" 這種格式
    }
</script>
</body>
</html>

HTML5 WebSocket 有關(guān)介紹,可以訪問(wèn)這里進(jìn)行學(xué)習(xí)。

前端代碼中 var ws = new WebSocket("ws://127.0.0.1:9501/"); 我的服務(wù)器是在本地,swoole.php 配置文件中配置的端口號(hào)是 9501,所以訪問(wèn)127.0.0.1:9501,ws 是 WebSocket 協(xié)議,與 HTTP、HTTPS 一樣,它有 WS 和 WSS 協(xié)議。ws.onmessage 可以接受消息。

接下來(lái)通過(guò)瀏覽器訪問(wèn)這個(gè) HTML 頁(yè)面,并打開瀏覽器調(diào)試控制臺(tái),可以看到連接成功的字樣,以及服務(wù)端打印出來(lái)的參數(shù):

Think-Swoole之WebSocket有什么用

然后我們?cè)趧偛艅?chuàng)建的 HTML 頁(yè)面的輸入框中發(fā)送消息,控制臺(tái)中打印出了我們的信息:

Think-Swoole之WebSocket有什么用

Swoole 監(jiān)聽服務(wù)終端中,也收到了我們發(fā)送過(guò)來(lái)的消息:

Think-Swoole之WebSocket有什么用

這是因?yàn)槲覀冊(cè)?app/listener/WsTest 打印了 $event 變量。

最后說(shuō)明一下前端頁(yè)面中 ws.send(JSON.stringify(['test',{to:to,message:message}])); 這段代碼,JSON.stringify() 的作用是將 JavaScript 對(duì)象轉(zhuǎn)換為 JSON 字符串,to 和 message 屬性是我們自定義的,test 是后端定義的 Test 事件,這個(gè)名稱一定和后端對(duì)應(yīng)起來(lái)。由于think-swoole中是按照 SocketIO 進(jìn)行解析發(fā)送過(guò)來(lái)的數(shù)據(jù),所以你發(fā)送的數(shù)據(jù)應(yīng)該是 “[‘事件名’, 真正要發(fā)送的數(shù)據(jù)]” 的字符串形式:第一個(gè)參數(shù)的 test 就是對(duì)應(yīng)服務(wù)器端的Test 事件,用于區(qū)分更多場(chǎng)景的實(shí)時(shí)通信邏輯業(yè)務(wù);第二個(gè)參數(shù)才是你真正發(fā)送的數(shù)據(jù),可以是字符串、數(shù)據(jù)、對(duì)象,服務(wù)器端 $event 參數(shù)獲取的就是它。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Think-Swoole之WebSocket有什么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

網(wǎng)站名稱:Think-Swoole之WebSocket有什么用
本文路徑:http://chinadenli.net/article4/pioooe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)ChatGPT、建站公司外貿(mào)建站、用戶體驗(yàn)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)