请教一个关于Pomelo Robot实现的问题。

我们想自己写robot测试脚本,具体做法就是让这个脚本连接我们的服务器,请求一些数据,然后结束。但试来试去都没有成功。
我们尝试过用pomelo-jsclient-websocket或者pomelo-jsclient-socket.io来连接服务器,但得到ReferenceError:window is not defined的错误(这两个库里的window对象没找到定义)。
我们又尝试使用pomelo-robot-demo中的代码来连接,它又报“TypeError: Cannot read property 'protos' of undefined”,说pomelo.data.protos中的protos属性没定义。
我们想把robot作为一个js客户端来连接服务器,请问怎么能实现这个需求呢?(最好能直接使用pomelo-jsclient-websocket/socket.io来做)。

谢谢!

标签:无
gonglei007 在 2013-10-30 16:29发布 分享到 weibo
2 回复
#1 {5} DoDeo 2013-10-30 20:26 回复

如果要用js客户端直接实现的话,pomelo-jsclient-websocket/socket.io,是肯定不行的,他们要基于游览器

pomelo-robot-demo中有个例子,你可以copy里面的 socket 实现,这个测试过是可以用的

至于protos,应该和你开启的protobuf有关,往这块检查下,是不是服务器设置问题,比如useProtobuf?比如serverProtos.json, clientProtos.json?

gonglei007 2013-10-31 11:16 回复

To @DoDeo:
多谢你的回复!
你说的这个方法我也在试,但我发现demo中的代码是websocket的连接,而我们服务器使用的是socket.io,这样我就又遇到了两个新问题:
1. 要么我去再实现一个socket.io的连接,好像比较复杂,也没有找到很合适的资料。
2. 要么把服务器改成websocket的(也许会比较快捷)。不过我在app.js里加如下代码并没有起作用,启动后依然是socket.io(我用浏览器访问返回的是welcome to socket.io)。

app.configure('production|development', 'connector', function(){
app.set('connectorConfig',
    {
        connector : pomelo.connectors.hybridconnector,
        heartbeat : 3,
        useDict : true,
        useProtobuf : true
    });

});

请问有可能是哪里出了问题呢?还有我们是要做一款手游(客户端是用Unity实现的),选择websocket是不是合适呢?

DoDeo 2013-10-31 11:27 回复

@gonglei007
首先,我的建议是选择 websocket,甚至建议你直接用 socket

另外,游览器返回 welcome to socket.io 恐怕是你服务器 web-server 里面返回的结果,并不是你的game-server返回的

不建议你用socket.io所以就没必要自己去实现socket.io的robot了

gonglei007 2013-10-31 15:40 回复

@DoDeo
按照你的建议,我们的服务器已经转为用websocket实现了,unity客户端连接也没有问题了。
现在我们在robot测试脚本(js的)中使用的就是demo中的那个基于websocket(ws)的pomelo客户端连接。以下是调用代码:

pomelo.init({host: '127.0.0.1', port: 3010, log: true}, function() {
console.log('connected...');
pomelo.request('connector.entryHandler.loadData', {uid: uid}, function(data) {
    console.log('request...');
  console.log('loadData is running ...');

  if(data.code === 2001) {
    console.log('Servers error!');
  }
  else{
      callback(data.host, data.port);
  }
});

});

pomelo.disconnect();
整个调用也没有报错,地址端口也都正确,但pomelo.init()并没有执行function()中的内容,也就是初始化/连接没有成功,也没有输出什么出错信息。
我进一步跟踪代码,发现没有地方调用socket.connection(但pomelo-robot-demo怎么正常工作呢)。
另外,这段代码的执行结果是连接正常断开,输出信息是socket close {"wasClean":true},这个应该是正确的是吧?
这里可能是什么问题呢?我应该再尝试往个方向去调试呢?

gonglei007 2013-10-31 16:20 回复

@DoDeo
我刚刚还做了另一个试验,就是直接用WebSocket连接服务器,代码如下:

var ws1 = new WebSocket('ws://127.0.0.1:3010');

ws1.on('open', function() {
console.log('ws opened.');
ws1.send('something');
});
ws1.close();

没有报错,但'open'后面的function也没有进入。

gonglei007 2013-10-31 16:26 回复

@DoDeo
我知道什么原因了,是因为我后面立即执行了ws.close/pomelo.disconnect。所以连接结果还没有返回回来就断开了。
多谢你前面的帮助!

#2 {1} roytan 2013-10-31 12:35 回复

也就是说Pomelo Robot不支持socket.io的pomelo测试?但是我现在服务器都是基于socket.io的,那么得自己写Robot的通信层了?

palmtoy 2013-11-1 14:31 回复

可以支持socket.io来做测试, 只要在如pomelo-robot-demo/app/script/lord.js等的用户脚本中来使用socket.io连接服务器即可.

回到顶部