socket.io - работает первый раз, а не второй - PullRequest
10 голосов
/ 21 сентября 2011

Когда я запускаю свой сервер 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();
        }); 

Ответы [ 3 ]

30 голосов
/ 21 сентября 2011

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

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

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

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

1 голос
/ 06 мая 2014

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

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

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

По-видимому, оба варианта имеют одинаковое поведение.

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

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

1 голос
/ 29 мая 2012

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

var socket = io.connect();

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

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

sio.set('transports', [
    'websocket'
    , 'flashsocket'
    , 'jsonp-polling'
    , 'xhr-polling'
    , 'htmlfile'
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...