Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.05.2014, 12:36
Интересующийся
Отправить личное сообщение для Arhangel64 Посмотреть профиль Найти все сообщения от Arhangel64
 
Регистрация: 06.10.2013
Сообщений: 20

Socket IO + History API проблема с мультиплексированием и переподключением
Здравствуйте.
Ситуация следующая. существует несколько страниц сайта, переключающиеся с помощью AJAX + History API по следующей схеме
<html>
<head>
</head>
<body>
    //некоторые заголовки, навигационная панель
    <script>
        //глобальный скрипт
    </script>
    <div id='pseudoBody'>
        //Страница сайта
        <script>
            //локальный скрипт
        </script>
    </div>
</body>
</html>


В глобальном скрипте происходит подключение к socket.io всех пользователей. Для них будут выводиться какие-то глобальные события.
В локальном скрипте происходит подключение к socket.io всех пользователей просматривающих данную страницу. Сообщения этой страницы должны приходить только этим пользователям. Например, страница с чатом.
То есть, на деле должно происходить следующее. Пользователь открывает любую страницу, подключается к глобальному сокету. Пользователь переходит на страницу с локальным сокетом, подклчается к нему. Когда выходит - отключается. Если захочет вернуться - снова подключается.
На деле выходит не совсем так.
Существует, так называемое, мультиплексирование соединений, то есть все открытые сокеты, по сути, передаются через один. При подключении первого сокета - открывается соединение, при подключении второго - второй сокет мультиплексируется в первое подключение, все корректно. При отключении локальный сокет отключается вроде корректно. Но при подключении обратно открывается новый сокет, который работает некорректно.
реализовано следующим образом.
На сервере:
var io = require('socket.io').listen(server)
io.set(... некоторые опции ...)
	
io.set('authorization', function(handshake, callback) {
... процесс авторизации из сессий экспресса ...
}


var chat = io
  .of('/chat') // локальный сокет
  .on('connection', function (socket) {
    ... Обработчики событий ...		
    socket.on('disconnect', function () {
      socket.broadcast.emit('leave', username);
    });
  });

var main = io
  .of('/main') // глобальный сокет
  .on('connection', function(socket) {
    ... обработчики событий  ...
  })


На клиенте в глобальном скрипте

var main = io.connect(location.host+'/main');
main
  .on('connection', function (){
    ... обработчики ...
  })

var socket; // переменная для локального сокета


В локальном

socket = io.connect(location.host+'/chat');
socket
  .on('connect', function() {

    ... обработчики ...
    
    socket.on('disconnect', function() {
    });
});


И, наконец функция, отвечающая за смену фрагмента документа, которая должна запускать новые скрипты и бивать старые сокеты

$.ajax({
      url: link,  //link ссылка на локальный документ
      method: "GET",
      data: null,
      statusCode: {
        200: function(jqXHR) {
		  if (socket) {
			socket.disconnect();
			socket = undefined;
		  }
          pseudobody.innerHTML = jqXHR;
		  var start = new Function ('callback', $('#pseudoBody script').get(0).innerHTML+'callback();');
		  start(function (){
			if (socket) socket.socket.connect();
		  });
        }
      }
});


Подскажите пожалуйста, где я ошибся? Почему переподключение мало того, происходит в новый сокет, так еще и висит мертвое - события по нему не приходят?

Последний раз редактировалось Arhangel64, 02.05.2014 в 12:40. Причина: Правка оформления кода
Ответить с цитированием
  #2 (permalink)  
Старый 03.05.2014, 10:23
Интересующийся
Отправить личное сообщение для Arhangel64 Посмотреть профиль Найти все сообщения от Arhangel64
 
Регистрация: 06.10.2013
Сообщений: 20

Кажется, разобрался, правда пришлось грубо нарушить принцип инкапсуляции, так как сделать интерфейсом socket.io сию операцию не вышло.
Теперь проблема другая. Каждый раз после дисконнекта события удваиваются. Подозреваю, что сервер просто не отпускает старый сокет, ответы, после переподключения, продолжают на него приходить.
Как убить сокет на сервере, не закрывая соединения?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посоветуйте как улучшить код для работы с history api [ jquery + js + history api ] Geo Ваши сайты и скрипты 0 12.01.2014 00:41
History API + jQuery кнопки "назад" и "вперед" Мушег (X)HTML/CSS 6 27.04.2013 18:33
history API и show more okapo AJAX и COMET 4 23.04.2013 20:31
Проблемы с пониманием History API Flaker AJAX и COMET 5 06.02.2013 15:28
History API. Помогите решить проблему InviS Events/DOM/Window 2 16.10.2011 14:34