今天主要總結下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消息