利用Swoole實現PHP+websocket直播,即使通訊


websocket

Websocket只是一個網絡通信協議就像 http、ftp等都是網絡通信的協議一樣
相對於HTTP這種非持久的協議來說,Websocket是一個持久化網絡通信的協議;

WebSocket和HTTP的關系

WebSocket和HTTP的關系

有交集,但是並不是全部。
Websocket只是借用了HTTP的一部分協議來完成一次握手。(HTTP的三次握手,此處只完成一次)

Http 協議

第一次握手:主機A發送位碼為syn1,隨機產生seq number=1234567的數據包到服務器,主機BSYN=1知道,A要求建立聯機;

第二次握手:主機B收到請求后要確認聯機信息,向A發送ack number=(主機Aseq+1),syn=1,ack=1,隨機產生seq=7654321的包

第三次握手:主機A收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機Bseq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。

完成三次握手,主機A與主機B開始傳送數據。

Long poll Ajax輪詢以及WebSocket的原理

1Ajax輪詢的原理。

場景如下:

客戶端:啦啦啦,有沒有新信息(Request)
服務端:沒有(Response
客戶端:啦啦啦,有沒有新信息(Request)
服務端:沒有。。(Response
客戶端:啦啦啦,有沒有新信息(Request)
服務端:你好煩啊,沒有啊。。(Response
客戶端:啦啦啦,有沒有新消息(Request
服務端:好啦好啦,有啦給你。(Response
客戶端:啦啦啦,有沒有新消息(Request
服務端:。。。。。沒。。。。沒。。。沒有(Response---- loop

代碼:

 

var polling = function(url, type, data){
    var xhr = new XMLHttpRequest(), 
        type = type || "GET",
        data = data || null;

    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4) {
            receive(xhr.responseText);
            xhr.onreadystatechange = null;
        }
    };

    xhr.open(type, url, true);
    //IE的ActiveXObject("Microsoft.XMLHTTP")支持GET方法發送數據,
    //其它瀏覽器不支持,已測試驗證
    xhr.send(type == "GET" ? null : data);
};

var timer = setInterval(function(){
    polling();
}, 1000);

 

 

 

2、long poll的原理。

long poll 其實原理跟 ajax輪詢 差不多,都是采用輪詢的方式,不過采取的是阻塞模型(一直打電話,沒收到就不掛電話),也就是說,

 客戶端發起連接后,如果沒消息,就一直不返回Response給客戶端。直到有消息才返回,返回完之后,客戶端再次建立連接,周而復始。

場景如下:

客戶端:啦啦啦,有沒有新信息,沒有的話就等有了才返回給我吧(Request)
服務端:額。。 (等待到有消息的時候)。。來 給你(Response)
客戶端:啦啦啦,有沒有新信息,沒有的話就等有了才返回給我吧(Request)

 客戶端:啦啦啦啦,有新信息么?

服務端:月線正忙,請稍后再試(503 Server Unavailable

客戶端:。。。。好吧,啦啦啦,有新信息么?
服務端:月線正忙,請稍后再試(503 Server Unavailable

客戶端:

 

代碼:

 

var longPoll = function(type, url){
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function(){
        // 狀態為 4,數據傳輸完畢,重新連接
        if(xhr.readyState == 4) {
            receive(xhr.responseText);
            xhr.onreadystatechange = null;

            longPoll(type, url);
        }
    };

    xhr.open(type, url, true);
    xhr.send();
}

 

 

 

然后服務端在一旁忙的要死:冰箱,我要更多的冰箱!更多。。更多。。

 從上面可以看出其實這兩種方式,都是在不斷地建立HTTP連接,然后等待服務端處理,可以體現HTTP協議的另外一個特點,被動性

何為被動性呢,其實就是,服務端不能主動聯系客戶端,只能有客戶端發起。

 缺陷:

從上面很容易看出來,不管怎么樣,上面這兩種都是非常消耗資源的。
ajax輪詢 需要服務器有很快的處理速度和資源。(速度)
long poll 需要有很高的並發,也就是說同時接待客戶的能力。(場地大小)
所以ajax輪詢 和long poll 都有可能發生這種情況。

 3、WebSocket的原理。

這時Websocket出現了。
他解決了HTTP的這幾個難題。
首先,被動性,當服務器完成協議升級后(HTTP->Websocket),服務端就可以主動推送信息給客戶端啦。
所以上面的情景可以做如下修改。
客戶端:啦啦啦,我要建立Websocket協議,需要的服務:chatWebsocket協議版本:17HTTP Request
服務端:ok,確認,已升級為Websocket協議(HTTP Protocols Switched
客戶端:麻煩你有信息的時候推送給我噢。。
服務端:ok,有的時候會告訴你的。
服務端:balabalabalabala
服務端:balabalabalabala
服務端:哈哈哈哈哈啊哈哈哈哈
服務端:笑死我了哈哈哈哈哈哈哈

 但是Websocket只需要一次HTTP握手,所以說整個通訊過程是建立在一次連接/狀態中,也就避免了HTTP的非狀態性,服務端會一直知道你的信息,直到你關閉請求,這樣就解決了接線員要反復解析HTTP協議,還要查看identity info的信息。

同時由客戶主動詢問,轉換為服務器(推送)有信息的時候就發送(當然客戶端還是等主動發送信息過來的。。),沒有信息的時候就交給接線員(Nginx),不需要占用本身速度就慢的客服(Handler

 

代碼見下篇

 

父親節快到了,常回家看看!

樹欲靜而風不止,子欲孝而親不在!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM