這篇文章主要介紹了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ù):
然后我們?cè)趧偛艅?chuàng)建的 HTML 頁(yè)面的輸入框中發(fā)送消息,控制臺(tái)中打印出了我們的信息:
Swoole 監(jiān)聽服務(wù)終端中,也收到了我們發(fā)送過(guò)來(lái)的消息:
這是因?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)