Node.JS,Socket.IO和群集中的WebSocket握手不起作用

我在使用Node.js,socket.io和node.js集群对应用程序进行集群时遇到了问题。

我使用socket.io-redis来共享所有工作人员的信息,但不工作。

我的代码:

var cluster = require('cluster'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { ... var express = require("express"); //Server var server = express(); //Socket.io var http = require('http').Server(server); var io = require('socket.io')(http); var redis_io = require('socket.io-redis'); var redis = require("redis"); io.adapter(redis_io({host: "127.0.0.1", port: 6379 })); ... } 

在客户端,我得到了像400错误握手错误或WebSocket连接build立之前closures。

我能做些什么来解决这个问题?

我使用最新版本的node.js和socket.io

谢谢!

我有同样的问题,我花了一段时间才弄明白。 一些研究解释说,这是因为一些传输,如长轮询,需要提出多个请求,以build立最佳连接。 跨请求存在状态,所以如果不同的连续请求被路由到不同的集群工作者,则连接失败。

http://socket.io/docs/using-multiple-nodes/上有一个关于它的页面,它引用了一个名&#x4E3A;sticky-session的自定义cluster模块,它可以解决这个问题: https : //github.com/indutny/sticky-会议

我真的不想使用它,因为基本上忽略了node.js团队在集群模块后面的TCP负载平衡方面的所有工作。

由于Web Socket协议本身只需要一个连接,所以我可以通过强制websocket成为第一个也是唯一的一个连接来解决这个问题。 我可以这样做,因为我控制客户端和服务器。 对于公共网页,由于您不得不担心浏览器的兼容性,因此您可能不太安全。 在我的情况下,客户端是一个移动应用程序。

这里是我放入testing页面的JavaScript客户端代码(再一次,真正的客户端是一个移动应用程序,所以我的网页实际上只是帮助构build和testing):

 var socket = io('http://localhost:8080/', { transports: [ 'websocket' ] });