天天看點

搖一搖誕生記七(php的workman及前端與websocket伺服器之間的消息類型)(cocos creator第一個項目)

今天主要總結下cocos  和 php webScokcet服務的通信。

php webSocket 服務 使用的第三方的開源代碼庫 workman , 當然swoole 肯定也是可以的。

自己實作websocket服務,不太切實際,服務難寫的穩定,不過看看webSocket協定及基本實作原理倒是可以。

我們使用的是 workman 的 Gateway架構 基于workman ,優勢是支援叢集部署,擴充友善。到workman的官方學習gateWay手冊,大概半天多的時間就能看完了,文檔還是很短的。

接下來就看看 我們已用遊戲的 gateway是怎麼實作的?上司簡單給我講了下,我發現還是很懵懂,研究了一兩小時代碼,當時已經快下班的時候,我在想如果還是套用已用邏輯,我可能卡死到這裡,因為我要十厘清楚原有邏輯。是以到晚上就決定,先按照自己的思路去寫,複制一份原來代碼來改。就這樣一步步,我也是實作了遊戲通信。時間又過了一周,到了收尾階段,再一次面臨這個問題,上司強烈要求共用原來的代碼,不過這次就變得更容易了解原來代碼的邏輯了。好比 解一道數學題,現有自己的思路去解決,再去看看别人怎麼解題的,更容易了解對方的,也知道兩種方式差别。改為原來邏輯 花了半天多的時間。

是以接下來,就不說中間自己一些消息處理,直接說說最終的消息處理方式。

所有消息包括手機端和大屏端的,都要做的首要通用的事是:

1.設定初始化值如:

$_maxUserCount= 200;

$_maxWaitUserCount = 200;

$_roomId    //值 是如: RoomShake911

$_screenUid    //值如: Screen911

$_onlineRoom   //值如: Online911

$_gameState   //值 如: gameState911

$_socketClientId  //值是 ==$client_id

等等

手機端用到的消息

1: login

調用時機: websocket 連接配接建立成功時onOpen() 中

php socket 收到login 做的事情:一,将使用者資訊 存入session中,二将client_id 與wxOpenid 綁定

2: peopleNum

調用時機: waiting 場景的onload 中

收到後做的事情: 一,給大屏端發送 ready資訊 包含用戶端使用者名,頭像,wxOpenid資訊。(有什麼用呢?大屏端可以顯示目前都有哪些使用者加入遊戲了,還可以将使用者資訊本地存儲);二給手機端發送 isOk 代表加入遊戲成功。

3: op

調用時機:game 場景 onload 中,主要是把手機搖出來的分數推送給大屏端,間隔100ms

收到後做的事情:基本是原樣把消息内容轉發給大屏端。

說明 op 用this.schedule,做定時發送發現有問題,慢阻塞,後來改為setInvertal 來定時發送!

大屏端用到的消息

1: gameState

調用時機: enroll, game, ranking 每個場景onload中都要調用。

收到後做的事情: 設定php socket 中redis存儲的key為gameSate的值

2: gameTime 

調用時機 ; enroll ,game,ranking 中。 enroll含義掃碼時間到了,就調用;game 中,遊戲時間結束了就發送;ranking中時間到了自動切換到enroll場景。

收到後做的事情: 基本原樣把資訊内容群發給房間的所有人。

3: scoreAdd

調用時機:game中每隔兩秒發送給手機端,每個手機端都發送,資訊包含了,手機端的最新排名。

收到後做的事情,原樣發送給uid 為wxOpenid的手機端。

4: gameFinish

調用時機: game遊戲結束時,注意要延遲一秒,因為 要等手機端先收到gameTime消息并切換到場景ranking不然,ranking中收不到gameFinish 消息,或者收到了,事件分發不到。 在手機端game 中也加入處理gameFinish 消息更佳。

收到後做的事情: 原樣發給Uid 為wxOpenid的手機端。

消息主要的就是這幾個了。

最後還想說下在本機虛拟機中gateWay搭建。需要安裝pctnl擴充,redis擴充。還有要注意是每次 改動gateway代碼後一定要重新開機gateway服務。

/**
   * 大屏端登入
   */
   public static function screen_login($message){
//    if(Gateway::isUidOnline(self::$_screenUid)){  開放去掉,上線 打開
//       return false;
//    }
           

我把上邊注釋掉了,原因是這個creator 環境會自動執行插件,這樣等我真正用模拟器 執行時,就return false;不過這個現象打包後應該不存在。

還有一個需要注意時間先後問題是:

大屏進入enroll要比,手機端進入waiting要早一點一兩秒就行。為什呢?因為大屏進入enroll後要發送gameState消息。手機端進waiting後要發送peopleNum消息