使用websockets手动连接到socket.io 1.x,进行容量测试

时间:2014-11-27 09:42:12

标签: node.js sockets heroku socket.io

我正在使用nodejs express服务器,该服务器使用socket.io来交流iOS客户端,并且在尝试测试有多少客户端可以在任何时间连接和交换数据时遇到一些麻烦。

我的目标是能够运行连接到socket.io的脚本和数千个不同的会话,以及发送和接收数据以了解我们系统的规模。目前我们在Heroku上使用单个dyno,但可能很快就会在AWS上考虑其他选项。

我找到的代码应该做我想要为早期版本的socket.io做的事情,例如this,但是因为看起来v1.x有一个非常不同的握手协议而有问题。我尝试使用socket.io-client包,但尝试多次连接只模拟一个会话的使用,我需要在独立用户中模拟很多。

我一直在拆分socket.io-client代码,但只是创建了一个连接 - 我被困在发送数据部分。如果任何人有任何知识或可能指向一些关于如何在客户端和socket.io服务器之间发送数据的书面资源,它将帮助我很多。

这是我到目前为止所拥有的:

var needle = require('needle'),
    WebSocket = require('ws'),
    BASE_URL = 'url-to-socket-host:5002';

var connectionNo = 0;
needle.get('http://' + BASE_URL + '/socket.io/?EIO=3&transport=polling&t=1416506501335-0',        function (err, resp) {

    // parse the sid
    var resp = JSON.parse(resp.body.toString().substring(5, resp.body.toString().length));

    // use the sid to connect using websockets
    var url = 'ws://' + BASE_URL + '/socket.io/?EIO=3&transport=websocket&sid=' + resp.sid;
    console.log(connectionNo + ' with sid: ' + resp.sid);
    var socket = new WebSocket(url, void(0), {
        agent: false
    });

    socket.on('open', function () {
        console.log('Websocket connected: ' + connectionNo);

        // I don't understand how to send data to the server here,
        // from looking at the source code it should use some kind 
        // of binary encoding, any ideas?

        socket.on('message', function (msg) {
            console.log(msg);
        });
    });
});

我将继续解构socket.io-client代码,但如果有人有任何可能有帮助的线索或资源,请告诉我。感谢。

2 个答案:

答案 0 :(得分:1)

我的问题在于您未在客户端代码中使用socket.io。您已导入(' ws'),这是另一个文档位于此处的模块:https://www.npmjs.org/package/ws

您可能想要ws.send('something');。当您在ws中收到消息时,它还附带一个带有属性的对象,该属性指示它是否是二进制数据。如果是,则需要逐步连接块。有一种规范的方法来做到这一点,你可以通过谷歌找到。但看起来有点像这样:

var message;
socketConnection.on('data', function(chunk){ message += chunk});

答案 1 :(得分:1)

我最终设置使用socket.io-client npm包,它能够连接到每个连接上的新会话。我在this issue找到了一个示例基准。

我不需要使用纯websockets和HTTP手动连接到socket.io,但感谢Yannik指出正在使用的parser。可以找到v1.x内部工作原理的规范here

谢谢!