我們來(lái)看最簡(jiǎn)單的pomelo框架的game-server部分,先上結(jié)構(gòu)圖
1 app 這是服務(wù)器擴(kuò)展的目錄,前臺(tái),邏輯相關(guān)的部分以后都會(huì)放到這個(gè)里面
2 config pomelo的服務(wù)器配置文件,通過(guò)pomelo框架,可以將此文件夾里面的json文件的配置直接用在對(duì)應(yīng)的服務(wù)上
3 logs 服務(wù)器日志文件
4 node_modules:這是非常重要的pomelo框架放置的地方
5 app.js 應(yīng)用程序入口
6 package.json 定義了整個(gè)應(yīng)用的依賴,以及應(yīng)用程序的信息
先看app.js這個(gè)入口,它的代碼也是非常的簡(jiǎn)潔<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">var pomelo = require('pomelo'); // 引入pomelo框架/** * Init app for client. */var app = pomelo.createApp();app.set('name', 'HelloWorld');// app configuration 配置類型為connector的服務(wù),并對(duì)其進(jìn)行初始化app.configure('production|development', 'connector', function(){ app.set('connectorConfig', { connector : pomelo.connectors.hybridconnector, heartbeat : 3, useDict : true, useProtobuf : true });});// 啟動(dòng)整個(gè)appapp.start();// 異常捕捉process.on('uncaughtException', function (err) { console.error(' Caught exception: ' + err.stack);});
其實(shí)程序員們沒(méi)干什么事情,完全是由pomelo框架來(lái)進(jìn)行處理
再來(lái)看config
這個(gè)里面是pomelo的幾大核心組件的配置文件了,在hello pomelo里面master.json和servers.json2個(gè)配置文件都有效,它們分別對(duì)應(yīng)master服務(wù)和app里面我們擴(kuò)展的服務(wù).
servers.json的內(nèi)容如下
<code class="hljs" json="">{ development:{ connector: [ {id: connector-server-1, host: 127.0.0.1, port: 3150, clientHost: 127.0.0.1, clientPort: 3010, frontend: true} ] }, production:{ connector: [ {id: connector-server-1, host: 127.0.0.1, port: 3150, clientHost: 127.0.0.1, clientPort: 3010, frontend: true} ] }}</code>
app/servsers/connector與其響應(yīng)
這個(gè)配置的內(nèi)容指定了connector的ip以及監(jiān)聽(tīng)端口,
clientHost與上一講中的客戶端連接時(shí)指定的ip地址相同,clientport與上一講web-server中的靜態(tài)頁(yè)面要連接的端口相同,這樣就可以接受來(lái)自網(wǎng)頁(yè)的連接了,由此可見(jiàn),這個(gè)connetctor就是負(fù)責(zé)與客戶端連接的服務(wù)器了.上一講中講到了客戶端向服務(wù)器發(fā)起連接的代碼如下
<code class="hljs" xml=""><script. type=text/javascript> var pomelo = window.pomelo; var host = 127.0.0.1; var port = 3010; function show() { pomelo.init({ host: host, port: port, log: true }, function() { pomelo.request(connector.entryHandler.entry, hello pomelo, function(data) { alert(data.msg); }); }); } </script></code>
看看我們game-server下的app目錄的結(jié)構(gòu)
實(shí)際上它用戶的就是服務(wù)器下的這個(gè)connector的handler的入口,非常的直觀,來(lái)看entryHandler.js的代碼
<code class="hljs" javascript="">module.exports = function(app) { return new Handler(app);};var Handler = function(app) { this.app = app;}; // 這就是客戶端調(diào)用的方法Handler.prototype.entry = function(msg, session, next) { //修改一下這里,把msg打印出來(lái),這樣可以在輸出里面看到客戶端發(fā)送過(guò)來(lái)的請(qǐng)求 console.log(entry client request = + msg); next(null, {code: 200, msg: 'game server is ok.'});}; // 客戶端也可以調(diào)用這個(gè)方法,各位可以試試Handler.prototype.publish = function(msg, session, next) { var result = { topic: 'publish', payload: JSON.stringify({code: 200, msg: 'publish message is ok.'}) }; next(null, result);}; // 客戶端也可以調(diào)用這個(gè)方法,各位可以試試Handler.prototype.subscribe = function(msg, session, next) { var result = { topic: 'subscribe', payload: JSON.stringify({code: 200, msg: 'subscribe message is ok.'}) }; next(null, result);};</code>
OK,到此為止,可以看到connector的Handler處理了客戶端的連接請(qǐng)求,并且也對(duì)其請(qǐng)求進(jìn)行了答應(yīng).
由此可見(jiàn),在pomelo中,要處理客戶端只要掛載handler模塊,然后在其中添加方法就OK了,只要這些方法能夠被客戶端給調(diào)用到,而且為了簡(jiǎn)潔hello pomelo中只有前端服務(wù)器(即暴露給客戶端連接的服務(wù)器),沒(méi)有后端(不暴露給客戶端,只能由前端服務(wù)器訪問(wèn)的服務(wù)器).
從理論上來(lái)講,這些connector負(fù)責(zé)承載客戶端連接,它的后面應(yīng)該還有具體的邏輯服務(wù)器來(lái)處理具體的應(yīng)用.
從hello pomelo來(lái)看,我們得出的是以下的hellopomelo的結(jié)構(gòu)圖
好了各位看官,這就是hellopomelo的結(jié)構(gòu)圖.
在此總結(jié)一下,pomelo是一個(gè)以node.js以及express為基礎(chǔ)的服務(wù)器框架,利用它可以很輕松的搭建基于websocket的服務(wù)器后臺(tái).
然后從這個(gè)例子來(lái)看它是分布式的,可擴(kuò)展性很好.