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

Posted

技术标签:

【中文标题】使用websockets手动连接socket.io 1.x,容量测试【英文标题】:Connecting to socket.io 1.x manually using websockets, capacity testing 【发布时间】:2015-01-25 20:34:42 【问题描述】:

我正在使用使用 socket.io 与 ios 客户端通信的 nodejs express 服务器,并且在尝试测试有多少客户端可以随时连接和交换数据时遇到了一些麻烦。

我的目标是能够运行一个脚本,通过数千个不同的会话连接到 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 代码,但如果有人有任何可能有帮助的线索或资源,请告诉我。谢谢。

【问题讨论】:

你可能想看看github.com/Automattic/socket.io-parser 太好了,谢谢 - 我一定错过了。 【参考方案1】:

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

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

谢谢!

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我了解ws 是一个单独的模块。我正在尝试使用ws 包来模拟socket.io 客户端代码所做的事情,因为使用socket.io-client 包只允许我使用一个会话进行连接。问题不在于如何使用ws 模块,而是试图了解socket.io 如何将数据从客户端传输到服务器,反之亦然。

以上是关于使用websockets手动连接socket.io 1.x,容量测试的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io:WebSockets 可以处理多少并发连接?

通过 websockets 的 Socket.io - 随机“传输端”断开连接

android studio连接io.socket:sokect.io-client服务器的条件

WebSockets(Socket.io)与heroku自动断开连接,我应该扩展吗?

使用 HTTP keep-alive 和 websockets (socket.io) 时的 TCP 连接数

从 C# 程序连接基于 node.js 的 socket.io WebSocket 服务器