Socket.IO(> = 1.0)和Bouncy

时间:2016-08-04 23:06:38

标签: node.js google-chrome firefox socket.io

Socket.IO和Bouncy之间似乎存在一些不兼容性:在Chrome和Firefox(不在Edge中),当我打开5个以上时,我的浏览器标签会挂起。

我知道它是由NPM模块引起的" Bouncy"因为如果我删除使用它的代码,一切正常,我可以打开多少浏览器标签没有限制。另一个罪魁祸首是Socket.IO的新版本(> = 1.0,我刚刚更新到),因为当我降级回v0.9.16时,问题也会消失。

这里有一些相关的服务器代码:

var port = 8502;
var bouncy = require('bouncy');
var socketio = require('socket.io');
var express = require("express");
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(port);

var serverBouncer = bouncy(function(req, res, bounce) {
    var path = req.url;
    var url = req.headers.host;
    if (typeof url !== "string") {
      res.send(500);
      res.end();
      return;
    }
    var urlArray = url.split('.');
    var bouncePort = port;
    if (!isNaN(urlArray[0]))
        bouncePort = parseInt(urlArray[0]);
    else if (String(urlArray[0]).toLowerCase() === "www" && !isNaN(urlArray[1]))
        bouncePort = parseInt(urlArray[1]);
    bounce(bouncePort);
});
serverBouncer.listen(80);


io.on("connection", function(socket) {
    //Some events...
});

以下是一些相关的客户代码:

var client = io.connect();

过去3天我一直试图解决这个问题,非常感谢任何帮助。

更新 这是chrome dev工具的网络标签的样子:

enter image description here

更新2:

我将socket.io(服务器端)的配置更改为强制websocket:

io.set('transports', ['websocket', 'polling']);

客户端也一样:

var client = io({transports: ['websocket', 'polling']});

但是现在我发出的事件无法到达服务器。这是网络标签的样子:

enter image description here

更新3: 主要组件的版本:

  • NodeJS v6.2.2
  • Socket.IO v1.4.8
  • Bouncy v3.2.2
  • Cors v2.7.1
  • Express v4.14.0
  • Npm v3.10.5

1 个答案:

答案 0 :(得分:0)

我设法用nginx替换弹性模块。请参阅我的其他问题以获得解决方案。

nginx : redirect to port according to domain prefix (dynamically)