Socket.io 连接恢复为轮询,从不触发“连接”处理程序

Posted

技术标签:

【中文标题】Socket.io 连接恢复为轮询,从不触发“连接”处理程序【英文标题】:Socket.io connection reverts to polling, never fires the 'connection' handler 【发布时间】:2014-08-02 02:24:04 【问题描述】:

我正在尝试将 socket.io 添加到我现有的 node.js 应用程序中。我在服务器端添加了socket.io库如下(直接在http://socket.io/get-started/chat/之后):

var express = require('express')
    , http = require('http')
    , path = require('path')
    , fs = require('fs');

var app = express();
var http = http.Server(app);
var io = require('socket.io')(http);

// Express settings [...]
// Express routes [...]

// Socket.io Communication
io.on('connection', function(socket) 
  console.log('a user connected');
);


// Start server
app.listen(config.port, function () 
  console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
);

现在,我只是在前端建立一个连接:

<script src="/socket.io/socket.io.js"></script>
<script>
  var io = io();
</script>

但是,控制台不会在控制台中显示“用户已连接”,而是会记录连续的投票流。我在 Mac 上使用最新版本的 Chrome,它支持 websockets。

GET /socket.io/?EIO=2&transport=polling&t=1402521519446-91 200 94ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519447-92 200 93ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519485-93 200 53ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519580-94 200 143ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519582-95 200 144ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519633-96 200 40ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519778-97 200 92ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519780-98 200 92ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519818-99 200 36ms - 6.96kb
GET /socket.io/?EIO=2&transport=polling&t=1402521519912-100 200 81ms - 6.96kb
[etc]

我一定是做错了什么。我对此很陌生,我很想指出正确的方向。如果我需要详细说明这个问题的任何部分,请告诉我。

谢谢! - 爱德华

============

编辑:

这是我当前使用的快速设置。我在一个全新的节点应用程序上尝试了相同的步骤,它似乎工作正常,所以我想知道这是否可能是问题。

app.configure('development', function()
    app.use(require('connect-livereload')());

    // Disable caching of scripts for easier testing
    app.use(function noCache(req, res, next) 
        if (req.url.indexOf('/scripts/') === 0) 
            res.header('Cache-Control', 'no-cache, no-store, must-revalidate');
            res.header('Pragma', 'no-cache');
            res.header('Expires', 0);
        
        next();
    );

    app.use(express.bodyParser(limit: '50mb')); // increase limit for audio recordings
    app.use(express.static(path.join(config.root, '.tmp')));
    app.use(express.static(path.join(config.root, 'app')));
    app.use(express.errorHandler());
    app.use(express.logger('dev'));

    util.logger.add(loggly,  
        [...Credentials...]
    );
    app.set('views', config.root + '/app/views');
);

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我的解决方法是替换这个

// Start server
app.listen(config.port, function () 
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
);

用这个:

// Start server
http.listen(config.port, function () 
    console.log('Express server listening on port %d in %s mode', config.port, app.get('env'));
);

这篇文章解释了原因:https://***.com/a/17697134/1515130

【讨论】:

以上是关于Socket.io 连接恢复为轮询,从不触发“连接”处理程序的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 无法连接,求助于“轮询”

连接错误:io.socket.engineio.client.EngineIOException:xhr 轮询错误

Zapier:如何确保我只为轮询触发器返回一次项目

socket.io 连接事件未在 Firefox 中触发

Socket.io断开事件错误地为其他用户触发,然后再次连接

socket.io 中的连接限制