pomelo服務端介紹(game-server/config/server.json):服務器
{ "development": { "connector": [ {"id": "connector-server-1", "host": "127.0.0.1", "port": 3150, "clientPort": 3010, "frontend": true}, {"id": "connector-server-2", "host": "127.0.0.1", "port": 3151, "clientPort": 3011, "frontend": true} ], "area": [ {"id": "area-server-1", "host": "127.0.0.1", "port": 3250, "areaId": 1} ], "gate": [ {"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 3014, "frontend": true} ] } }
能夠看出,服務端是由如下幾個部分構成:session
* 2 個 `connector` 服務器,主要用於接受和發送消息。
* 1 個 `gate` 服務器,主要用於負載均衡,未來自客戶端的鏈接分散到兩個 `connector` 服務器上。
* 1 個 `area` 服務器,主要用於驅動遊戲場景,和遊戲邏輯負載均衡
由服務端的關係圖能夠看出,訪問pomelo,首先應該訪問gate服務端,讓服務端爲其分配合適的connector以處理當前用戶的請求。frontend
1.連接gate服務端,將玩家名稱傳遞給gate服務端以做爲註冊ide
config.global.pomelo.request("gate.gateHandler.queryEntry", { uid: config.global.playerName }, this.onGateMsg);
2.當gate服務端連接返回成功後,連接gate服務端返回的地址,連接分配給本身的connector服務端學習
private onGateMsg(gate_data) { this.connectIp = gate_data.host; this.connectPort = gate_data.port; config.global.pomelo.disconnect(); trace("正在嘗試連接connect服務端..."); config.global.pomelo.open(network.PomeloService.CONNECTION, this.connectIp, this.connectPort); }
3.使用connector.entryHandler.entry在connector中註冊,註冊成功後,使用area.playerHandler.enterScene訪問遊戲場景信息ui
private onConnectSucceed() { trace("CONNECT服務端連接成功"); trace("開始註冊服務端信息..."); config.global.pomelo.request('connector.entryHandler.entry', { name: config.global.playerName }, this.onEntryMsg); } private onEntryMsg(entry_data) { if (entry_data.code === 200) { trace("註冊信息成功"); trace("開始申請進入遊戲..."); config.global.pomelo.request('area.playerHandler.enterScene', { name: config.global.playerName, playerId: entry_data.playerId }, (respose) => { Global.dispatchEvent(events.PomeloServerEvents.MAPMSG, respose); trace("進入遊戲成功"); trace("開始解析地圖信息"); }); } else { trace("註冊服務端信息出現問題,請檢查提交信息"); } }
4.遊戲中會將地下散落的物品、玩家的位置以json格式返回 給客戶端(返回的數據示例)
{ "code": 200, "data": { "area": { "id": "1", "entities": { "1": { "x": 2041, "y": 256, "entityId": 1, "kindId": "3", "kindName": "極限法劍", "areaId": 1, "type": "treasure", "imgId": 301804, "score": 20 }, "2": { "x": 1354, "y": 633, "entityId": 2, "kindId": 86, "kindName": "威嚴腿鎧", "areaId": 1, "type": "treasure", "imgId": 344721, "score": 80 }, "3": { "x": 719, "y": 460, "entityId": 3, "kindId": 103, "kindName": "護身符", "areaId": 1, "type": "treasure", "imgId": 980057, "score": 1 }, "4": { "x": 246, "y": 1003, "entityId": 4, "kindId": 64, "kindName": "玉樹Belt", "areaId": 1, "type": "treasure", "imgId": 371501, "score": 25 }, "5": { "x": 1343, "y": 426, "entityId": 5, "kindId": 15, "kindName": "緊身衣", "areaId": 1, "type": "treasure", "imgId": 331203, "score": 21 }, "6": { "x": 417, "y": 336, "entityId": 6, "kindId": 75, "kindName": "幻彩玉帶", "areaId": 1, "type": "treasure", "imgId": 374224, "score": 90 }, "7": { "x": 1311, "y": 262, "entityId": 7, "kindId": 73, "kindName": "百竄雲", "areaId": 1, "type": "treasure", "imgId": 374222, "score": 80 }, "8": { "x": 1385, "y": 870, "entityId": 8, "kindId": 57, "kindName": "熒光墜子", "areaId": 1, "type": "treasure", "imgId": 384921, "score": 71 }, "9": { "x": 432, "y": 1044, "entityId": 9, "kindId": 111, "kindName": "靈魂之石", "areaId": 1, "type": "treasure", "imgId": 90102, "score": 85 }, "10": { "x": 910, "y": 451, "entityId": 10, "kindId": 21, "kindName": "鎖子甲", "areaId": 1, "type": "treasure", "imgId": 334303, "score": 80 }, "11": { "x": 982, "y": 160, "entityId": 11, "kindId": 21, "kindName": "鎖子甲", "areaId": 1, "type": "treasure", "imgId": 334303, "score": 80 }, "12": { "x": 746, "y": 374, "entityId": 12, "kindId": 32, "kindName": "流雲", "areaId": 1, "type": "treasure", "imgId": 394224, "score": 64 }, "13": { "x": 894, "y": 827, "entityId": 13, "kindId": 32, "kindName": "流雲", "areaId": 1, "type": "treasure", "imgId": 394224, "score": 64 }, "14": { "x": 1027, "y": 724, "entityId": 14, "kindId": 73, "kindName": "百竄雲", "areaId": 1, "type": "treasure", "imgId": 374222, "score": 80 }, "15": { "x": 699, "y": 156, "entityId": 15, "kindId": 60, "kindName": "Belt", "areaId": 1, "type": "treasure", "imgId": 371101, "score": 1 }, "16": { "x": 881, "y": 792, "entityId": 16, "kindId": 109, "kindName": "聖母之鏡", "areaId": 1, "type": "treasure", "imgId": 90412, "score": 61 }, "17": { "x": 1442, "y": 96, "entityId": 17, "kindId": 62, "kindName": "銀Belt", "areaId": 1, "type": "treasure", "imgId": 371201, "score": 13 }, "18": { "x": 1754, "y": 265, "entityId": 18, "kindId": 84, "kindName": "獨孤腿鎧", "areaId": 1, "type": "treasure", "imgId": 344701, "score": 66 }, "19": { "x": 1384, "y": 279, "entityId": 19, "kindId": 13, "kindName": "布衣", "areaId": 1, "type": "treasure", "imgId": 331103, "score": 1 }, "20": { "x": 1277, "y": 439, "entityId": 20, "kindId": 108, "kindName": "鑽石之星", "areaId": 1, "type": "treasure", "imgId": 90472, "score": 51 }, "21": { "x": 53, "y": 313, "entityId": 21, "kindId": 53, "kindName": "骷髏吊墜", "areaId": 1, "type": "treasure", "imgId": 381701, "score": 31 }, "22": { "x": 965, "y": 367, "entityId": 22, "kindId": 73, "kindName": "百竄雲", "areaId": 1, "type": "treasure", "imgId": 374222, "score": 80 }, "23": { "x": 146, "y": 94, "entityId": 23, "kindId": 69, "kindName": "攫魂鈴", "areaId": 1, "type": "treasure", "imgId": 371803, "score": 55 }, "24": { "x": 374, "y": 400, "entityId": 24, "kindId": 100, "kindName": "荒蕪之鞋", "areaId": 1, "type": "treasure", "imgId": 364724, "score": 70 }, "25": { "x": 1668, "y": 807, "entityId": 25, "kindId": 105, "kindName": "先祖護符", "areaId": 1, "type": "treasure", "imgId": 980055, "score": 21 }, "26": { "x": 875, "y": 384, "entityId": 26, "kindId": 39, "kindName": "布帽", "areaId": 1, "type": "treasure", "imgId": 321101, "score": 17 }, "27": { "x": 1799, "y": 146, "entityId": 27, "kindId": 105, "kindName": "先祖護符", "areaId": 1, "type": "treasure", "imgId": 980055, "score": 21 }, "28": { "x": 1543, "y": 384, "entityId": 28, "kindId": 31, "kindName": "風雲雷電", "areaId": 1, "type": "treasure", "imgId": 394223, "score": 56 }, "29": { "x": 668, "y": 1083, "entityId": 29, "kindId": 73, "kindName": "百竄雲", "areaId": 1, "type": "treasure", "imgId": 374222, "score": 80 }, "30": { "x": 1884, "y": 420, "entityId": 30, "kindId": 61, "kindName": "緞帶", "areaId": 1, "type": "treasure", "imgId": 371103, "score": 7 }, "31": { "x": 2022, "y": 715, "entityId": 31, "kindId": 48, "kindName": "媚狐頭飾", "areaId": 1, "type": "treasure", "imgId": 324701, "score": 85 }, "32": { "x": 1568, "y": 1138, "entityId": 32, "kindId": "9", "kindName": "豐城劍", "areaId": 1, "type": "treasure", "imgId": 304504, "score": 68 }, "33": { "x": 1219, "y": 747, "entityId": 33, "kindId": 63, "kindName": "水晶Belt", "areaId": 1, "type": "treasure", "imgId": 371401, "score": 19 }, "34": { "x": 1696, "y": 1146, "entityId": 34, "kindId": 16, "kindName": "鱗甲", "areaId": 1, "type": "treasure", "imgId": 331303, "score": 31 }, "35": { "x": 881, "y": 563, "entityId": 35, "kindId": 54, "kindName": "蒼魂珠", "areaId": 1, "type": "treasure", "imgId": 384222, "score": 41 }, "36": { "x": 1983, "y": 456, "entityId": 36, "kindId": 101, "kindName": "玉衡之履", "areaId": 1, "type": "treasure", "imgId": 364803, "score": 85 }, "37": { "x": 268, "y": 164, "entityId": 37, "kindId": 88, "kindName": "斬魂腿甲", "areaId": 1, "type": "treasure", "imgId": 344922, "score": 90 }, "38": { "x": 1373, "y": 1047, "entityId": 38, "kindId": "8", "kindName": "寒雪槍", "areaId": 1, "type": "treasure", "imgId": 304501, "score": 60 }, "39": { "x": 964, "y": 790, "entityId": 39, "kindId": 26, "kindName": "摺扇", "areaId": 1, "type": "treasure", "imgId": 391201, "score": 18 }, "40": { "x": 1257, "y": 1099, "entityId": 40, "kindId": 66, "kindName": "白麪狼牙", "areaId": 1, "type": "treasure", "imgId": 371601, "score": 37 }, "54": { "x": 436, "y": 208, "entityId": 54, "kindId": 210, "areaId": 1, "id": 214, "type": "player", "name": "ss", "walkSpeed": 240, "score": 0 } }, "width": 2200, "height": 1201 }, "playerId": 214 } }
5.客戶端根據返回的json,顯示裝備和玩家位置,並監聽服務端中的移動以及狀態更改事件,來作出相應的操做。
下面來看一下,pomelo服務端中是怎麼處理前端的請求的。
在treasures的項目文檔docs/tutorial.md 中給出的示例以下圖
在(1)中,客戶端經過pomelo.request方法,將gate.gateHandler.queryEntry 以及參數 uid 傳遞給gate服務端,下一步,咱們進入服務端看一下(2)路徑中的gateHandler文件
該方法爲當前用戶獲取一個connector服務端,將用戶uid參數與獲取到的connector服務端綁定,並將分配後的connector服務端的獲取狀態code,連接host,端口port,返回給客戶端進行處理,客戶端在經過gate服務端接收到返回的參數後,就能夠將gate服務端斷開,而後連接分配給本身的connector服務端進行連接,經過 connector.entryHandler.entry,connector服務端會在用戶第一次連接的時候初始化session信息,這樣每次的服務端請求的時候,都不用再次 傳遞多餘的數據。
entry方法成功後會向用戶返回一個狀態code 和玩家惟一標識playerId,客戶端記住玩家惟一標識,以區分同場景中多個玩家時,哪個玩家爲本身的玩家。
這樣一條用戶請求和服務端返回的流程就走完了。