2012-04-17 271 views
10

我一直在盯着node.js和socket.io示例整个下午,我试图拼凑一个简单的页面,告诉我有多少用户连接到服务器。nodejs socket.io无法连接到服务器?

我已阅读http://socket.io/的文档以及这里的几个教程/问题,概述了我正在尝试做的事情。我也发现create simple node js server and client哪些不帮我。

版本信息:

的node.js - 0.6.15
快递 - 3.0.0alpha1
socket.io - 0.9.5(socket.io客户端是相同的版本,但是不查找资源...查看评论)
EJS - 0.7.1

这里是我的服务器代码:

var express = require('express'), 
    config = { 
     port: 4000, 
     hostname: 'localhost' 
    }; 

var server = module.exports = express.createServer(); 
    /* server configuration */ 
    server.use(express.cookieParser('keyboard unicorn')); 
    server.use(express.bodyParser()); 
    server.use(express.methodOverride()); 
    server.use(express.session({ secret: 'keyboard unicorn' })); 
    server.engine('.html', require('ejs').__express); 
    server.set('views', __dirname + '/lib/views'); 
    server.set('view options', { layout: false }); 
    server.set('view engine', 'html'); 
    server.use(server.router); 
    server.use('/', express.static(__dirname + '/lib/assets')); 

var io = require('socket.io').listen(server); 

var connections = { 'length': 0 }; 

io.sockets.on('connection', function(socket) { 
    socket.__fd = socket.fd; 
    connections[socket.__fd]=socket.remoteAddress; 
    ++connections.length; 
    console.log('user connected! There are a total of ' + connections.length + ' users online.'); 
    return socket.on('disconnect',function(){ 
     delete conns[socket.__fd]; 
     --connections.length; 
     console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.'); 
    }); 
}); 

server.get('/', function(req, res) { 
    res.render('index', { 
     'page_title': 'sample application', 
     'number_of_connections': connections.length 
    }); 
}); 

server.listen(config.port, config.hostname); 

这里是我的客户端代码:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title><%= page_title %></title> 
</head> 
<body> 
<div>There is a total of <%= number_of_connections %> user(s) connected.</div> 
<script src="http://cdn.socket.io/stable/socket.io.js"></script> 
<script type="text/javascript"> 
var socket = new io.Socket('localhost',{'port':4000}); 
socket.connect(); 
socket.on('connect', function() { 
    console.log('connected'); 
}); 
</script> 
</body> 
</html> 

下面是当我运行服务器发生了什么事,并与客户端连接。

$ node server.js 
    info - socket.io started 

然后当我导航到我的web浏览器上的localhost:4000我得到'0'(number_of_connections)的页面。 ('连接'从未被击中)

在客户端上,一两秒钟后,我开始得到大量的错误(如果我离开控制台打开它崩溃了几秒钟的页面)看到图像的下方:

enter image description here

请与从哪里开始进行调试这个任何帮助,将不胜感激我只想得到这个简单的例子了并运行,所以我可以开始玩/理解nodejs和socket.io!

+0

开始的好地方是你的节点版本和socket.io版本。我在0.6中看到cdn.socket.io的版本。例如,我看到我使用socket.io 0.8.7和节点v0.6.4。另外,是否有一个原因,你不只是''src =“/ socket.io/socket.io.js”>'?您可以尝试一下,看看结果是否不同(因为会绕过版本错误的可能性) – Kato 2012-04-17 20:35:28

+0

'加载资源失败:服务器响应状态为404(未找到)http:// localhost:4000/socket.io/socket.io.js' – rlemon 2012-04-17 20:37:42

+0

嗯,这很奇怪。当然,我的开箱即用,所以我无法帮你解决为什么你不能使用本地socket.io URL。顺便说一句,我的socket.io客户端版本是0.8.7(相同的socket.io的) - 不知道是否重要... – Kato 2012-04-17 20:45:24

回答

14

问题是因为Express现在是一个函数。

你需要做到以下几点:

var express = require('express'); 
var app = express(); 
var server = app.listen(3000); 

var io = require('socket.io').listen(server); 
+0

@Linus G. Thiel指出我正确的答案,我相信@tehlulz偶然发现了正确的答案,但提出了错误的理由。我将在此评论中提及@ tehlulz的代码。 似乎在Express 3.0.x中,应用程序本身(不管它是用'express.createServer()'还是'express()'创建的)不包含足够的信息来允许Socket.IO直接监听它。相反,它是'app.listen(PORT)'的返回值,它是Socket.IO应该监听的内容,而不是'app'本身。 – btown 2012-07-10 19:42:17

+0

我有完全相同的问题,这个解决方案为我工作。 +1为伟大的答案 – lhk 2012-07-26 12:23:13

+1

太糟糕了,这不被标记为答案。这是如何得到快速3.0与socket.io – Benny 2013-01-10 07:23:19

4

Express 3.0.0alpha and socket .io由于Express在2. *和3. *之间的变化(或更确切地说,连接在1. *和2. *之间的变化),不是(直接)兼容的。我建议您暂时降级到Express 2.5.9,或者您可以按照Express的作者TJ Holowaychuk的this advice

+0

很酷。我会试试这个,谢谢你。 – rlemon 2012-04-17 23:47:12

4

我建立了一个测试环境,安装了express 3.0和socket.io 0.9.5,并重现你的错误。

然后我跑npm install [email protected]根据migration guide做了一些倒退调整,它运行的很好。

所以我打算继续,并建议socket.io可能与express 3不兼容,但仍然看起来相当不稳定。

我app.js调整了快递2:

var express = require('express'), 
    config = { 
    port: 8080, 
    hostname: 'localhost' 
}; 

var server = module.exports = express.createServer(); 
/* server configuration */ 
server.set('views', __dirname + '/lib/views'); 
server.set('view options', { layout: false }); 
server.set('view engine', 'ejs'); 
//server.register('.html', 'ejs');require('ejs').__express); 
server.use(express.cookieParser('keyboard unicorn')); 
server.use(express.bodyParser()); 
server.use(express.methodOverride()); 
server.use(express.session({ secret: 'keyboard unicorn' })); 
server.use('/', express.static(__dirname + '/lib/assets')); 
server.use(server.router); 

var io = require('socket.io').listen(server); 

io.set('log level', 2); 

var connections = { 'length': 0 }; 

server.get('/', function(req, res) { 
     res.render('index', { 
       'page_title': 'sample application', 
        'number_of_connections': connections.length 
        }); 
    }); 

io.sockets.on('connection', function(socket) { 
     socket.__fd = socket.fd; 
     connections[socket.__fd]=socket.remoteAddress; 
     ++connections.length; 
     console.log('user connected! There are a total of ' + connections.length + ' users online.'); 
     return socket.on('disconnect',function(){ 
       delete conns[socket.__fd]; 
       --connections.length; 
       console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.'); 
      }); 
    }); 

server.listen(config.port); 

我的指数。ejs文件:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title><%= page_title %></title> 
</head> 
<body> 
<div>There is a total of <%= number_of_connections %> user(s) connected.</div> 
<!--<script src="http://cdn.socket.io/stable/socket.io.js"></script>--> 
<script src='/socket.io/socket.io.js'></script> 
<script type="text/javascript"> 
    var socket = io.connect('http://hostname.com:8080'); 
    socket.on('connect', function() { 
     console.log('connected'); 
    }); 
</script> 
</body> 
</html> 

我希望在这里有所帮助。

+0

哇,非常有帮助的回复。我希望我可以两次对你加油!我将切换我的安装,并希望这也能为我解决问题! – rlemon 2012-04-17 23:46:50

+0

我已经改变了你的建议,并调整了一下我的应用,使它与旧版本兼容...现在我得到了'警告 - 未知的传输:“未定义”\ n信息 - 未处理的socket.io url' – rlemon 2012-04-18 12:56:37

+0

s/\ n /换行符 – rlemon 2012-04-18 13:09:18

0

取代app.use(express.bodyParser());,与

app.use(express.json()); 
app.use(express.urlencoded()); 

...保存文件,重新启动节点服务器。