【 每日·槽】第7话 – socket.io 历险记
一个开发者和cocos的私人恩怨
最近工作需要使用socket.io,一波三折终于搞定,心路历程记录一下。
使用cocos2d-js 3.3
一、例子出错
socket.io没用过,怎么办?先看例子呗。但引擎自带的SocketIO Test 点击按钮后却没有任何反应,log一看。。

为何要拒绝我!直接访问网址

好吧。。。。服务器维护。。。
二、版本问题
哎,只能自己写一个服务端了。一开始一直出错,后来才发现cocos2d使用的是0.9.3版的socket.io,我用的最新的。。。。
var http =require('http').createServer();
var socket = require('socket.io');
http.listen(3000, function(){
console.log('listening on *:3000');
});
socket.listen(http).on('connection', function (socket) {
socket.on('message', function (msg) {
console.log('Message Received: ', msg);
//socket.broadcast.emit('message', msg);
});
socket.on('hehe', function (data){
console.log(data);
socket.send("欢迎 " + data.name);
socket.emit('login');
});
});
客户端代码:
var client = SocketIO.connect("127.0.0.1:3000", {"force new connection" : true});
client.send("Im coming!~~~~~~~~");
client.emit("hehe", "{\"name\":\"hehe\"}]");
client.on("message", function () {
cc.log("message~~~");
});
client.on("login", function () {
cc.log( "loging~~~~");
});
client.on("disconnect", function () {
cc.log("disconnect~~~~");
});
三、SocketIO.cpp 的问题
服务端 socket.emit(‘login’); 后,
客户端收不到消息
client.on("login", function () {
cc.log("login~~~~");
});
原因:SocketIO.cpp 里437行
pos2 = s_data.find(","); 但是我 socket.emit(‘login’); "login"后面并没有传参数,它当然找不到。。结果就出错了。
自己瞎改了下:
pos = s_data.find(":");
pos2 = s_data.find(",");
// 我加的代码,找不到","就找"}"
if(pos2 == std::string::npos) {
pos2 = s_data.find("}");
}
就可以了。
四、html5版和jsb版不统一
jsb搞定了,ch5里一试,果然有问题。(咦,我为什么要说“果然”)
服务端:socket.emit(‘login’, 123, “sss”);
客户端:client.on(“login”, function (data) {
cc.log(data + " loging~~~~");
});
html5版将参数直接传递过去,而jsb版解析为json字符串。
html5版:

JSB版:

可能这个功能不是很多人用到,所以才有这样那样的问题。我纪录下来方便别人查阅。
最后还想再说说,随着Unreal, Unity 这些成熟的商业引擎越来越亲民,egret, layabox的背后夹击,cocos如何能够继续吸引开发者?现在引擎的性能已经不能再当作一个卖点了,应该更多的强调用户体验。其他的不想再吐槽了再吐我就要吐了。。。
往期回顾:
【 每日·槽】第1话 – 论setEnabled和setVisible http://www.cocoachina.com/bbs/read.php?tid=181496
【 每日·槽】第2话 – 模态窗口的制作 http://www.cocoachina.com/bbs/read.php?tid=181959
【 每日·槽】第3话-- UITextField的七宗罪 http://www.cocoachina.com/bbs/read.php?tid=182207
【 每日·槽】第4话-- UITextField 中文字符的长度检测问题 http://www.cocoachina.com/bbs/read.php?tid=187118
【 每日·槽】第5话 – 2014CocoaChina春季开发者大会实吐 http://www.cocoachina.com/bbs/read.php?tid=194385
【每日·槽】第6话 – 心急的Auto-culling http://www.cocoachina.com/bbs/read.php?tid-197837.html
