繁体   English   中英

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

[英]WebSocket handshake in Node.JS, Socket.IO and Clusters not working

我在使用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在建立连接之前关闭。

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

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

谢谢!

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

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

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

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

这是我放入测试页面的JavaScript客户端代码(同样,真正的客户端是一个移动应用程序,所以我的网页实际上只是帮助构建和测试):

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

您必须使用粘性会话来避免客户端从初始握手连接到不同的服务器。 请参阅https://github.com/elad/node-cluster-socket.io

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM