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

person user644745    schedule 21.09.2011    source источник
comment
Я действительно не баловался sockets.io, но, насколько я могу судить, вы не закрываете соединение и не слушаете событие соединения. Теоретически, не приведет ли ваше первое соединение к тому, чтобы сервер ответил, а последующие сообщения на самом деле не попали бы в это событие?   -  person Chance    schedule 21.09.2011
comment
Прошу прощения за то, что не предоставил полный код. но у меня есть отключение как на стороне клиента, так и на стороне сервера .. обновление рассматриваемого кода ..   -  person user644745    schedule 21.09.2011
comment
возникла проблема при ответе на ваши вопросы. На самом деле код сокета в порядке ... при отключении на стороне сервера я также отключал соединение с базой данных, и это создало проблему. Спасибо за указатель !!   -  person user644745    schedule 21.09.2011
comment
Я не могу ответить на ваш вопрос окончательно, потому что вы не включили второй вызов connect. При необходимости разместите дополнительный код на gist.github.com или на аналогичном сайте и включите ссылку в ваш вопрос.   -  person Joseph    schedule 21.09.2011


Ответы (3)


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

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

Обходной путь - передать параметр 'force new connection' при вызове connect(). Например:

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

person Joseph    schedule 21.09.2011
comment
Спасибо за "принудительное новое соединение" ... Я не знал об этом. - person user644745; 22.09.2011
comment
Большое спасибо. Вы спасли мне жизнь;) Я ненавижу тех ребят из nodejs / socket.io с их обновлениями. Мне почти ни разу не удавалось обновиться, чтобы что-то не развалилось. Я разработал версию 0.6 и недавно обновил рабочий сервер. И получили жалобы от клиентов, что он не работает. Как правило, не так-то просто все правильно протестировать, и подобные изменения не улучшают ситуацию. - person ZolaKt; 21.03.2013
comment
может кто-нибудь, пожалуйста, отметьте это как лучший ответ, так как OP сказал, что это сработало? - person Uriel Arvizu; 25.01.2014
comment
кстати, у этой работы есть неприятный побочный эффект. Если вы используете интервалы между именами в ваших сокетных соединениях io.connect ('/ mySocket1') и io.connect ('/ mySocket2'), использование «force new connection» приведет к тому, что они не будут совместно использовать соединение, как они это делают по умолчанию; Таким образом, хотя это позволит вам повторно подключить два потерянных соединения после принудительного отключения при повторном подключении, каждое из них будет иметь собственное соединение. - person Chris Wininger; 09.03.2015

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

var socket = io.connect();

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

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

sio.set('transports', [
    'websocket'
    , 'flashsocket'
    , 'jsonp-polling'
    , 'xhr-polling'
    , 'htmlfile'
]);
person Milan Babuškov    schedule 28.05.2012

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

  • "force new connection":true при вызове клиента connect ().

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

По-видимому, оба ведут себя одинаково.

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

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

person bluehallu    schedule 06.05.2014