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