【问题标题】:socket.io - works first time, not second time onwardssocket.io - 第一次工作,而不是第二次
【发布时间】:2011-11-21 21:41:09
【问题描述】:

当我启动我的 node.js 服务器并连接客户端时,我能够从客户端 (socket.emit) 发送请求并获得响应 (socket.on('rentsAround'....))。但是当我第二次连接时,客户端可以发送,但服务器无法发送或发出。所以我必须再次重新启动服务器。我知道它按预期工作,但不知何故我的理解在某个地方是错误的......请有人指出。

客户端: ========

    var socket = new io.Socket();
    socket = io.connect();

    socket.on('rentsAround', function(data){
        registration.handleRentsAround(data);
    });


    socket.on('locationDetailsRes', function(data){
        registration.handleRentsAround(data);
    });

    socket.on('connect', function(data){
        alert('inside connect on client side');
    });

socket.on('disconnect', function(){ 
    // do something, if you want to. 
    });
    .............
    socket.emit("searchRent",  {"lat":lat, "lng":lng});

服务器端: ========

socket.sockets.on('connection', function(client){ 

            client.on('searchRent', function(msg){
        console.log('inside on connection');
                // do something and reply back
        client.emit('rentsAround',{"totalRents":docs.length, "rents":docs});
            });

   client.on('disconnect', function(){ 
        sys.puts("client disconnect"); 
        mongoose.disconnect();
        }); 

【问题讨论】:

  • 我还没有真正涉足 sockets.io,但据我所知,您并没有关闭连接并收听连接事件。从理论上讲,您的第一次连接不会导致服务器响应并且后续消息实际上不会触发该事件吗?
  • 很抱歉没有提供完整的代码。但我确实在客户端和服务器端都断开连接..更新有问题的代码..
  • 在回复您的查询时遇到了问题。实际上套接字代码很好..在服务器端断开连接时,我也断开了数据库连接,这造成了问题。谢谢你的指点!!
  • 我无法明确回答您的问题,因为您还没有包括第二次致电 connect。如果需要,请在 gist.github.com 或同等网站上发布更多代码,并在您的问题中包含链接。

标签: node.js websocket express socket.io


【解决方案1】:

Socket.io 0.7 及以后的版本将尝试重用与同一主机的连接。根据我的经验,我发现这种行为可能有点古怪。

我无法从您提供的小代码示例中看出,但我怀疑问题是对connect() 的第二次调用试图重用第一个(关闭的)连接。 p>

解决方法是在调用connect() 时传递'force new connection' 选项。例如:

io.connect("http://localhost", {'force new connection': true});

【讨论】:

  • 感谢“强制新连接”...我不知道。
  • 非常感谢。你救了我的命;)我讨厌那些 nodejs/socket.io 的更新。我几乎从来没有设法在没有崩溃的情况下进行更新。我在 0.6 上开发,最近更新了生产服务器。并收到客户抱怨它“不起作用”。一般来说,正确地测试所有东西并不容易,像这样的改变并不能让它变得更好。
  • 有人可以将此标记为最佳答案,因为 OP 说它有效吗?
  • 仅供参考,这项工作有一个烦人的副作用。如果您在套接字连接 io.connect('/mySocket1') 和 io.connect('/mySocket2') 上使用名称间距,则使用“强制新连接”将导致它们不像默认情况下那样共享连接;因此,虽然它允许您在重新连接时强制断开连接后重新连接两个丢失的连接,但它们每个都有自己的连接。
【解决方案2】:

您的第二行丢弃了在第一行中创建的对象。只需这样做就可以了:

var socket = io.connect();

第一次发送和第二次失败的问题可能是由于浏览器/协议造成的。我已经在 Internet Explorer 和 XHR 传输以及使用 JSONP 的 Opera 中看到了这种行为。

如果您使用的是 IE,请尝试切换到 JSONP,它应该可以正常工作。这可以通过将传输列表提供给配置来在服务器端完成。只要确保 JSONP 出现在 XHR 之前。像这样的:

sio.set('transports', [
    'websocket'
    , 'flashsocket'
    , 'jsonp-polling'
    , 'xhr-polling'
    , 'htmlfile'
]);

【讨论】:

    【解决方案3】:

    从 socket.io 1.0 开始,有两个设置控制此行为:

    • "force new connection":true,在客户端 connect() 调用中。

    • "cookie":false,在服务器 Server() 构造函数上。

    显然,两者都产生完全相同的行为。

    从今天起,第二种方法是无证的。但是,查看源代码可以看到传递给 socket.io Server() 的所有选项都传递给了内部 Engine.io 库 Server() 构造函数,它允许您更改那里的任何选项。这些选项记录在这里:

    https://github.com/LearnBoost/engine.io

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 2011-05-25
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      相关资源
      最近更新 更多