socket.io - 第一次工作,而不是第二次工作

时间:2011-09-21 12:06:53

标签: node.js websocket express socket.io

当我启动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();
        }); 

3 个答案:

答案 0 :(得分:30)

Socket.io 0.7以后将尝试重用连接到同一主机。根据我的经验,我发现这种行为可能有点不稳定。

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

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

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

答案 1 :(得分:1)

您的第二行会丢弃第一行中创建的对象。简单地这样做应该有效:

var socket = io.connect();

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

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

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

答案 2 :(得分:1)

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

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

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

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

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

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