自从决定用node.js+socket.io+express来实现服务器端后,学习了一下,觉得全部自己写服务器端,简单测试或是小游戏还行,以后要是稍稍复杂一些,对我这种菜鸟就比较头疼。最好能有个类似前端的cocos creator这样的工具比较好,不用从底层写起。
全网搜查,貌似网易很久以前出了一个pomelo框架比较合心意,集成了socket.io和express,https://github.com/NetEase/pomelo/wiki/Home-in-Chinese 有很详细的讲解,总之介绍里写的很强大,微信咨询了同在北京的几个游戏公司的程序,都说听过pomelo,做做轻量级的游戏还是没问题的,问题肯定很多,但都可以解决。
奈何高手无法想象菜鸟菜的下限,当把老旧的pomelo和新生的cocos creator 1.8.2集成在一起,还是碰到不少问题。于是又开始全网挖贴,终于挖到了eddy_wiki https://www.jianshu.com/p/c64f7607adee ,一切的一切都在eddy的基础下变得异常简单。之后又在eddy帖子下看了夜雨归人( https://www.jianshu.com/p/42ec9893389a )的一些改进,一切OK。下面按照官方教程和各路高手的指点,一步一步开始:
第一步:安装pomelo及必要的相关软件,上面链接的官方教程足够详细,大家按着做就行。另外注意就是要安装python和vs2010。vs2010要吞噬10g的硬盘,对于c盘只剩3g,D盘只剩9g的我,无异于一个大雷。总之就是没安装vs2010。但是vc++的环境还是要上, https://github.com/nodejs/node-gyp#installation ,选择windows-> option 1 的方法,直接npm install --global --production windows-build-tools,把python和 vc++一起搞定了,大约不到2g的硬盘空间。如果之前没装过python,别忘了设置环境变量,设置的方法在安装pomelo教程的结尾处。
第二步:创建pomelo项目,选择connector的时候,选择2)socket.io。这里建议下载pomelo官方的例子chatofpomelo-websocket,因为eddy的教程也是基于这个例子修改的,用起来方便。下载这个例子还是直接看教程就好。
第三步:运行例子。在game server 文件夹下cmd,pomelo start有几率(比如我)碰到了以下问题
[2017-11-23 11:54:42.226] [ERROR] console - Option path is not valid. Please refer to the README.
[2017-11-23 11:54:42.226] [ERROR] console - Option close timeout is not valid. Please refer to the README.
[2017-11-23 11:54:42.226] [ERROR] console - Option heartbeats is not valid. Please refer to the README.
[2017-11-23 11:54:42.226] [ERROR] console - Option log level is not valid. Please refer to the README.
解决方法详见 http://www.cnblogs.com/zhongweiv/p/nodejs_pomelo.html ,原贴作者指出是新版的socket.io用法不正确引发。用 https://github.com/NetEase/pomelo/blob/master/lib/connectors/sioconnector.js 来替换下载的…\chatofpomelo-websocket\game-server\node_modules\pomelo\lib\connectors\sioconnector.js 即可解决。
在web server文件夹下node app,有几率碰到warning,关于express.createServer(),进入web server的app.js,把var app = express.createServer(); 改成var app = express();
聊天室在用户推出后,报错[ERROR] pomelo-rpc - [mqtt-mailbox] rpc connector-server-1 callback timeout 30000, remote server 6 host: 127.0.0.1, port: 6050,参照夜雨归人的解决方法,进入\game-server\app\servers\connector\handler里的entryHandler.js,将其中的onUserLeave函数修改为:
var onUserLeave = function(app, session) {
if(!session || !session.uid) {
return;
}
app.rpc.chat.chatRemote.kick(session, session.uid, app.get(‘serverId’), session.get(‘rid’), function(){
console.log("====== kick callback over! ======");
});
};
问题解决,夜雨归人说chatRemote也要改,看了一下代码,貌似官方已经按照夜雨归人的观点改完了,咱们就不用管了。
为什么说有几率碰到呢,原来我是的确碰到了这些问题, 今天(2018.5.14)又下载一下例子,寻思复现问题截个图,结果都没有出现…估计有人在github 上pull request通过了。难道网易还在维护?总之今天有点懒,就不去查看了。
例子运行成功之后,就可以进入聊天室聊天了。服务端没啥问题,那下面,就要到cocos creator了。
第四步:制作cocos creator使用的pomelo库的脚本。进入…/chatofpomelo-websocket/web-server/public/js/lib/components,继续往下有四个文件夹,每个都有一个js脚本,把这四个都拉到cocos creator的项目里script文件夹下面
1)component-emitter下的index.js拉到creator项目里,改名为emitter.js,在module.exports = Emitter;下面加上一句window.EventEmitter = Emitter;
2)pomelo-client.js 中第五行var Protocol = window.Protocol修改为var Proctocol = require(“protocol”);
3)protobuf.js第37行,将(this.protobuf = {}),修改为{}。
4)protocol.js最后,第350行,将(this.protocol = {}),修改为{}。
第五步:需要一个前端配合一下,为了省事,还是直接用eddy的吧,
git clone https://github.com/eddy2015/ccc-pomelo-chat-client.git ,把第四步做好的pomelo包,也就是那四个js,替换ccc-pomelo-chat-client项目pomelo目录下的四个js,其他的界面之类,直接拿来就好啦。
第六步:运行服务器端,进入game-server文件夹,地址栏输入cmd(如果总是输cmd,觉得恶心,找问题也麻烦,就webstorm吧),然后输入命令pomelo start,运行cocos creator项目ccc-pomelo-chat-client,不出意外就成功了,不会有问题。
印象中还有些小问题,比如websocket找不到啊,或者socket.io的问题,都是用eddy的例子之前自己调试遇到的,后来直接用eddy的例子就没有了。以后复现问题的时候再补充,估计都是socket.io版本和一些写法导致的问题。