使用GatewayWorker 開發個即時聊天demo


前言:

    上手冊以示尊重:https://www.kancloud.cn/walkor/gateway-worker/326138;

    https://www.cnblogs.com/fuqiang88/p/5956363.html

    先介紹下GarewayWorker吧,GarewayWorker是基於Workerman開發的一個框架。講通俗就是用來長連接的。

    那么又為什么要長連接呢?

    通常來說客戶端與服務端的聯系就是請求響應。由客戶端發起請求給服務端,然后在服務端接收請求並響應將資源發送給客戶端,就結束了。那么如果想要通過服務端建立兩個客戶端之間的聯系怎么辦呢?

    其實想想也不難,假設有客戶端A和客戶端B再加一個服務器。客戶端A請求服務器說‘服務器大哥我請你幫我向客戶端B帶句話’,那么服務器接收客戶端A的請求知道了這件事,那很簡單啊!服務器就返回個響應給客戶端A說‘行行行’,然后服務器在將消息發送給客戶端B,這不就解決了嘛,皆大歡喜!滿分!放禮炮!

    然后,本質上服務器不能主動向客戶端發消息啊!我們所知道的客戶端和服務器之間的聯系都是由客戶端單方面發起的,客戶端發送tcp連接,然后發起http請求,服務器只負責響應(好被動)。所以要實現客戶端和服務器的全雙工通信就要建立長連接。

    GarewayWorker就是用來建立長連接的。(行吧,扯不下去了,畢竟是小白)。

內容:

  • GatewayWorker  

 

    講一下GatewayWorker的工作原理吧。GatewayWorker主要分為三個進程,Register、Gateway、BusinessWorker。Register進程主要負責調度其他另兩個進程的注冊。Gateway主要負責維持和客戶端的連接,將客戶端發送過來的請求轉發給響應的BusinessWorker進行處理,並接收BusinessWorker處理完的數據將其發送給相應的客戶端。BusinessWorker進程默認調用Events.php中的onConnect onMessage onClose處理業務邏輯。

    我們運用此框架開發只要關注業務功能上如何實現就好了。所以我們先了解下框架的業務邏輯入口Event.php。首先來認識下里面的方法

    1. onWorkerStart   進程啟動事件
    2. onConnect              連接事件(有客戶端連接進來就觸發)
    3. onMessage        消息事件(有客戶端發送消息時觸發)
    4. onClose                關閉連接事件
    5. onWorkerStop         進程退出事件

    通過以上監聽事件來拓展業務業務需求。我的小demo主要用到了連接事件和消息事件。

  • WebSocket

    WebSoket是一種網絡通信協議,就像HTTP一樣。

    首先問個為什么出現!

    大家都知道HTTP協議的特點,無狀態、無連接、單向的應用層協議。采用了請求響應式模型。

    WebSocket的出現就是為了結局HTTP的單向性。由於HTTP無法實現服務器向客戶端主動的發送消息,所以之前的解決方式就是通過在客戶端AJAX異步請求實現長輪詢,就是隔一段時間就去請求服務器看是否有變動,這樣就到時每次請求都得去建立連接(或者HTTP請求啟用長連接,一直保持HTTP連接始終打開)。

    所以WebSocket就出現了,WebSocket連接允許客戶端和服務器之間進行全雙工通信,以便任一方都可以通過建立連接將數據推送到另一方。

    記錄下在博文中看到的這一句

(基於多線程或多進程的服務器無法適用於 WebSockets,因為它旨在打開連接,盡可能快地處理請求,然后關閉連接。任何實際的 WebSockets 服務器端實現都需要一個異步服務器。)

  • WebSocket客戶端

    在客戶端,沒有必要為 WebSockets 使用 JavaScript 庫。實現 WebSockets 的 Web 瀏覽器將通過 WebSockets 對象公開所有必需的客戶端功能(主要指支持 Html5 的瀏覽器)。

    了解下WebSocket對象的相關事件

    1. Socket.onopen     連接時觸發
    2. Socket.onmessage    收到服務端消息時觸發
    3. Socket.onerror      通信發生錯誤時觸發
    4. Socket.onclose   連接關閉時觸發

    有沒有跟上面的GatewayWorker很像,通信上主要的事件無非就是連接關閉、接收消息嘛。


        好了,知識點差不多就這樣吧,感覺說的什么玩意兒。但是還是要開始說說我的demo開發了。

    我是laravel + GatewayWorker開發的demo

    用laravel用來處理邏輯,GatewayWorker主要負責維持客戶端的長連接。

    頁面用layui前端框架(因為現公司用這個)

    頁面設計像命令行那樣吧,迷之審美,上圖

    好吧!世仇!

    

 

       

 


免責聲明!

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



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