Socket.io - работает впервые, а не во второй раз

Когда я запускаю свой сервер node.js и клиент подключается, я могу отправить запрос от клиента (socket.emit) и получить ответ (socket.on('rentsAround'....)), Но когда я подключаюсь 2-го раза вперед, клиент может отправить, но сервер не может отправить или испустить. Поэтому я снова должен перезапустить сервер. Я понимаю, что он работает так, как ожидалось, но почему-то мое понимание где-то не так... Кто-то, пожалуйста, укажет.

клиентская сторона: ========

    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();
        }); 

Ответ 1

Socket.io 0.7 начнет попытки повторного использования соединений с одним и тем же хостом. По моему опыту, я обнаружил, что это поведение может быть немного ошибочным.

Я не могу сказать из небольшого примера кода, который вы указали, но я подозреваю, что проблема заключается в том, что второй вызов connect() пытается повторно использовать первое (закрытое) соединение.

Обходным путем является передача опции 'force new connection' при вызове connect(). Например:

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

Ответ 2

Вторая строка отбрасывает объект, созданный в первой строке. Просто это должно сработать:

var socket = io.connect();

Проблема с первым отправкой и вторым сбоем может быть связана с браузером/протоколом. Я видел такое поведение с Internet Explorer и XHR-транспортом, а также с Opera с помощью JSONP.

Если вы используете IE, попробуйте переключиться на JSONP, и он должен работать правильно. Это можно сделать на стороне сервера, предоставив список транспорта в конфигурацию. Просто убедитесь, что JSONP подходит к XHR. Что-то вроде этого:

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

Ответ 3

Как и для socket.io 1.0, две настройки управляют этим поведением:

  • "force new connection":true, на вызове client connect().

  • "cookie":false, на сервере Server() конструктор.

По-видимому, обе производят то же самое поведение.

Второй метод, на сегодняшний день, недокументирован. Тем не менее, глядя на исходный код, вы можете видеть, что все параметры, переданные в socket.io Server(), передаются внутреннему конструктору Server Engine Engine(), который позволяет вам изменять любые параметры. Эти параметры описаны здесь:

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