与 engine.io 的 Nodejs 服务器/客户端套接字连接

Posted

技术标签:

【中文标题】与 engine.io 的 Nodejs 服务器/客户端套接字连接【英文标题】:Nodejs server/client socket connection with engine.io 【发布时间】:2014-04-06 02:23:42 【问题描述】:

我正在尝试在正在侦听端口 8888 的 engine.io 套接字侦听器和在普通 index.html 中运行的 javascript 客户端之间建立一个简单的套接字连接

完成这项任务看起来相当简单,但不知何故我无法正确连接 xhr-polling 客户端。它连接,因为客户端数量增加,但客户端永远不会触发 onopen 事件。取而代之的是,服务器端的客户端数量不断增加,客户端永远不会从服务器接收任何消息 - 服务器也不会从客户端接收任何消息。

这一切都与 websocket 传输完美配合,但我也需要 xhr-polling 才能工作。

app.js

var engine = require('engine.io');
var server = engine.listen(8888);

server.on('connection', function (socket) 
    console.log(server.clientsCount);
    socket.send('never received by client'); // << xhr-polling client does not receive
    socket.on('message', function (msg) 
        if ('echo' == msg) socket.send(msg);
    );
);

index.html

<html>
<head>

<script src="engine.io.js"></script>
<script>
    var socket = eio('ws://localhost:8888/'); << starts polling immediately like crazy
    socket.onopen = function()
        console.log('never fired'); << never sent to console
        socket.onmessage = function(data);
        socket.onclose = function();
    ;
</script>

</head>
<body>
</body>
</html>

客户端控制台

GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 280ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 1ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 1ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 1ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 0ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 0ms engine.io.js (Zeile 1585)
GET http://localhost:8888/engine.io/?EIO=2&transport=polling 200 OK 0ms engine.io.js (Zeile 1585)

【问题讨论】:

遇到完全相同的问题。我来自github 的engine.io.js 文件有很多在客户端不可用的依赖项。客户端需要Dont know I it is the correct one. Is the /lib`文件夹吗? 据我所知 - 或者我到现在为止的假设 - 提供的 engine.io.js 已经是一个捆绑的库,类似于通过 browserify 运行 nodejs 客户端代码时得到的工具。 是的,自述文件也是这么说的。但是,如果您在此处查看当前可用的engine.io.js 版本:github.com/LearnBoost/engine.io-client/blob/master/engine.io.js,那么您已经看到了两个在客户端不应该可用的需求(第 8 行和第 12 行)。由于某种原因,它仍然没有任何错误地连接,并且返回了 socket.id,但从单个窗口每分钟大约 150 次。 我已经用 0.9.0 版本的那个替换了我从 github 上的 master-branch 复制/粘贴的 engine.io.js,它现在突然可以工作了。从我这边来看,使用开发版相当愚蠢。 谢谢,该文件似乎有效。不过,我仍然想知道,如果自述文件声称它是独立版本,那么像 module.exports = require('./lib/'); 这样的行有什么用。我没用Browserify,好像没什么用。 【参考方案1】:

如果您的 HTML 和静态文件 (JS) 是来自另一个域的服务器(例如 localhost:80,端口 == 另一个“域”)。 然后由于安全原因,它可能会因 CORS 原因而拒绝 WebSocket 或其他流量。

使用您喜欢的浏览器的开发工具中的“网络”选项卡,检查正在发生的事情以及是否有任何请求失败以及它们的标头。

【讨论】:

以上是关于与 engine.io 的 Nodejs 服务器/客户端套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

engine.io 与 socket.io 有何不同?

engine.io 和 socket.io 有啥区别?

socket.io分布式

需要Engine.IO教程[关闭]

engine.io 是不是支持安全的 WebSockets wss?

engine.io/wss/SSL/HTTP:如何配置?