簡體   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