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 连接恢复为轮询,从不触发“连接”处理程序的主要内容,如果未能解决你的问题,请参考以下文章
连接错误:io.socket.engineio.client.EngineIOException:xhr 轮询错误