【问题标题】:nodejs socket.io cannot connect to server?nodejs socket.io 无法连接到服务器?
【发布时间】:2012-04-17 20:26:44
【问题描述】:

我整个下午都在盯着 node.js 和 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-client 是同一版本,但是找不到资源...见 cmets)
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)的页面。此外,我在服务器的终端中什么也看不到(on.('connection' 永远不会被命中)。

在客户端上,一两秒后,我开始收到大量错误(如果我让控制台打开几秒钟,页面就会崩溃)见下图:

请提供任何有关从何处开始调试的帮助,我们将不胜感激!我只想启动并运行这个基本示例,这样我就可以开始使用/理解 nodejs 和 socket.io!

【问题讨论】:

  • 一个好的起点是你的 node 版本和 socket.io 版本。我在 0.6 中看到了 cdn.socket.io 的版本。例如,我看到我正在使用带有节点 v0.6.4 的 socket.io 0.8.7。另外,您是否有理由不选择&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;?您可以尝试一下,看看结果是否不同(因为这会绕过版本错误的可能性)
  • Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:4000/socket.io/socket.io.js
  • 嗯,这很奇怪。当然,我的工作是开箱即用的,所以我对你为什么不能使用本地 socket.io URL 没有太多帮助。顺便说一句,我的 socket.io-client 版本是 0.8.7(与 socket.io 相同)——不知道这是否重要......
  • 我的客户端和我的socket-io版本一样
  • 对,但是您使用的 cdn.socket.io/stable 是 0.6。我发现一些 cmets 说明了这个旧版本的问题。想知道如何让你的本地加载?

标签: node.js socket.io


【解决方案1】:

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

您需要执行以下操作:

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

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

【讨论】:

  • @Linus G. Thiel 指出了正确的答案,我相信 @tehlulz 偶然发现了正确的答案,但给出了错误的理由。我将在此评论中提及@tehlulz 的代码。似乎在 Express 3.0.x 中,应用程序本身,无论是使用 express.createServer() 还是 express() 创建的,都没有包含足够的信息来让 Socket.IO 直接监听它。相反,Socket.IO 应该监听的是 app.listen(PORT) 的返回值,而不是 app 本身。
  • 我遇到了完全相同的问题,这个解决方案对我有用。 +1 的好答案
  • 太糟糕了,这没有被标记为答案。这是如何让 express 3.0 与 socket.io 一起工作
  • 这需要更多的支持。辛苦了,这才是正确的答案!
【解决方案2】:

Express 3.0.0alpha 和 socket.io 不(直接)兼容,因为 Express 在 2.* 和 3.* 之间发生了变化(或者更确切地说,是 Connect 在 1.* 和 2.* 之间发生了变化)。我建议你暂时降级到 Express 2.5.9,或者你可以关注 Express 的作者 TJ Holowaychuk 的this advice

【讨论】:

    【解决方案3】:

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

    然后我运行npm install express@2.5.1,在migration guide 的基础上进行了一些向后调整,运行良好。

    所以我会继续建议 socket.io 可能与 express 3 不兼容,它看起来仍然很不稳定。

    我的 app.js 针对 express 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);
    

    我的 index.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>
    

    我希望这里有帮助。

    【讨论】:

    • 哇,非常有帮助的回复。我希望我能给你两次投票!我将切换我的安装,并希望这也能解决我的问题!
    • 我已经按照您的建议进行了更改并稍微调整了我的应用程序以使其与旧版本兼容...现在我收到了warn - unknown transport: "undefined"\n info - unhandled socket.io url
    • 您是否取消了 .html/ejs 位的注释?这让我有些头疼,我只是将 index.html 转换为 index.ejs。我会从那里开始,但这可能是任何事情。考虑用你的新配置发布一个新问题;有人会知道的:)
    • 是的...当客户端的心跳运行时会发生这种情况。此外,应用程序仍然无法告诉我用户何时连接......即“连接”事件永远不会被拾起。
    【解决方案4】:

    app.use(express.bodyParser());替换为

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多