2015-02-14 7 views
2

Всякий раз, когда я отсоединяюсь с помощью socket.disconnect();, а затем повторно подключаюсь с помощью socket.connect();, сервер дважды запускает мой код квитирования. Странная вещь, хотя код соединения с сервером работает дважды, после повторного подключения есть только одно соединение в моем массиве. Это происходит при случайном отключении, преднамеренном или даже при перезапуске сервера. Бит кода:Socket.IO: Reconnect вызывает код подключения к серверу для запуска дважды

io.on('connection', OnConnect); 
function OnConnect(socket) { 

    var connection = { socket: socket, realIp: ip, token: GenerateConnToken() }; 
    connections.push(connection); 
    console.log('Connected'); 

    // Client will respond to this by emitting "client-send-info". 
    // This is emitted once on initial connect, but twice on reconnect. 
    socket.emit('acknowledge', connection.token); 

    socket.on('client-send-info', function() { 

     console.log('Client Sent Info'); 
    }); 

    socket.on('disconnect', function() { 
     console.log('Disconnected'); 
    }); 
} 

Приведенный выше код, когда клиент подключается, разъединяет, а затем воссоединяет один раз, будет производить следующий лог:

Connected

Клиент Направлено Info

Отсоединение

Подключено

Клиент Направлено Info

Клиент Направлено Информация

Почему, при повторном подключении, код подключения будет работать в два раза, но создать только один объект подключения?

EDIT: при дальнейшем осмотре кажется, что другой код моего соединения выполняется дважды, когда клиент повторно подключается. Вышеприведенный код обновляется для отражения соответствующей информации.

ответ

1

Странно, решение является полностью клиентской стороной. Вместо того, чтобы следующий код:

var socket = io.connect(); 
socket.on('connect' function() { 
    socket.on('acknowledge', function() { 

    }); 
}); 

Вы должны использовать:

var socket = io.connect(); 
socket.on('connect' function() { 

}); 

socket.on('acknowledge', function() { 

}); 

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

Просто не помещайте никаких дополнительных звонков socket.on('x') внутри звонка on('connection'). Оставьте их всех вне его.

+0

Спасибо, это действительно помогло прояснить беспорядок в моей голове. – udjat

+0

Я думаю, что эта проблема происходит на сервере. какое-либо решение на сервере, и как сервер может знать, что происходит повторное подключение? – Xin

Смежные вопросы