一、websocket介紹
1.1、websocket是什么呢?
websocket是一個(gè)協(xié)議,它僅僅就是一個(gè)協(xié)議而已,跟我們所了解的http協(xié)議、https協(xié)議、ftp協(xié)議等等一樣,都是一種單純的協(xié)議。
1.2、websocket的特點(diǎn)呢?
相對(duì)于Http這種非持久連接而言,websocket協(xié)議是一種持久化連接,它是一種獨(dú)立的,基于TCP的協(xié)議?;趙ebsocket,我們可以實(shí)現(xiàn)客戶(hù)端和服務(wù)端雙向通信。
在websocket出現(xiàn)之前,為了解決此類(lèi)問(wèn)題,常用的解決方法有輪詢(xún)和long pull,這兩種技術(shù)都是客戶(hù)端和服務(wù)端建立源源不斷的HTTP連接,非常消耗帶寬和服務(wù)器資源。
websocket是雙向持久連接,客戶(hù)端和服務(wù)端只需要第一次建立連接即可實(shí)現(xiàn)雙向通信。
二、Swoole_websocket簡(jiǎn)介
Swoole增加了內(nèi)置的WebSocket服務(wù)器支持,通過(guò)幾行PHP代碼就可以寫(xiě)出一個(gè)異步非阻塞多進(jìn)程的WebSocket服務(wù)器。
onOpen
WebSocket客戶(hù)端與服務(wù)器建立連接并完成握手后會(huì)回調(diào)此函數(shù)。
$req 是一個(gè)Http請(qǐng)求對(duì)象,包含了客戶(hù)端發(fā)來(lái)的握手請(qǐng)求信息
onOpen事件函數(shù)中可以調(diào)用push向客戶(hù)端發(fā)送數(shù)據(jù)或者調(diào)用close關(guān)閉連接

onOpen事件回調(diào)是可選的

onMessage
當(dāng)服務(wù)器收到來(lái)自客戶(hù)端的數(shù)據(jù)幀時(shí)會(huì)回調(diào)此函數(shù)。

$frame 是swoole_websocket_frame對(duì)象,包含了客戶(hù)端發(fā)來(lái)的數(shù)據(jù)幀信息
onMessage回調(diào)必須被設(shè)置,未設(shè)置服務(wù)器將無(wú)法啟動(dòng)
$frame?
$frame 共有4個(gè)屬性,分別是:
$frame->fd,客戶(hù)端的socket_id,使用$server->push推送數(shù)據(jù)時(shí)需要用到。
$frame->data,數(shù)據(jù)內(nèi)容,可以是文本內(nèi)容也可以是二進(jìn)制數(shù)據(jù),可以通過(guò)opcode的值來(lái)判斷
$frame->opcode,WebSocket的OpCode類(lèi)型,可以參考WebSocket協(xié)議標(biāo)準(zhǔn)文檔
$frame->finish, 表示數(shù)據(jù)幀是否完整,一個(gè)WebSocket請(qǐng)求可能會(huì)分成多個(gè)數(shù)據(jù)幀進(jìn)行發(fā)送
Push方法
$fd 客戶(hù)端連接的ID,如果指定的$fd對(duì)應(yīng)的TCP連接并非websocket客戶(hù)端,將會(huì)發(fā)送失敗
$data 要發(fā)送的數(shù)據(jù)內(nèi)容向websocket客戶(hù)端連接推送數(shù)據(jù),長(zhǎng)度最大不得超過(guò)2M。
$data 如果是文本類(lèi)型,編碼格式必然是UTF-8,這是WebSocket協(xié)議規(guī)定的
$opcode,指定發(fā)送數(shù)據(jù)內(nèi)容的格式,默認(rèn)為文本。發(fā)送其它格式可以參考文檔常量