Комнаты Socket.io во враждебной сетевой среде?

У меня очень неприятная проблема с сетевым окружением клиента, и я надеюсь, что кто-то может помочь мне разобраться в этом...

У них есть приложение, которое сейчас полностью написано в VBA для Excel. (Не смеется.)

Часть моей помощи им в улучшении их продукта и пользовательского опыта заключалась в преобразовании их пользовательского интерфейса из элементов формы VBA в единый элемент WebBrowser, который содержит многофункциональное веб-приложение, которое обменивается данными между Excel и их серверами. Это делается главным образом через сервер / соединение socket.io.

Когда пользователь входит в систему, устанавливается соединение с комнатой на сервере сокетов.

Начальный "владелец" называется:

socket.on('create', function (roomName, userName) {
    socket.username = userName;
    socket.join(roomName);
});

Последовательность "участника" называется:

socket.on('adduser', function (userName, roomName){

    socket.username = userName;
    socket.join(roomName);
    servletparam = roomName;
    var request = require('request');

    request(bserURL + servletparam, function (error, response, body) {
        io.sockets.to(roomName).emit('messages', body);
    });

    servletparam = roomName + '|' +  userName;
    request( baseURL + servletparam, function (error, response, body) {
        io.sockets.to(roomName).emit('participantList', body);
    });
});

Все это прекрасно работало, пока мы не дошли до того, что их код VBA заблокировал бы все, что привело бы к потере соединения с сокетом. Когда клиент формируется, возникает вынужденная пауза, вызванная VBA (которая длится где-то от 20 секунд до 3 минут), я пытаюсь снова присоединиться к комнате, передав щелчок по элементу HTML, который запускает сценарий для повторного соединения. Как ни странно, это не работает. Однако, если я подожду несколько секунд и нажму на объект рукой, он вернется в комнату. Да, щелчок поступает из файла Excel... мы видим сообщение на сервер сокетов, но это не позволяет этому вызову вернуться в комнату.

Вот что делает это действительно трудным для отладки. Нет возможности видеть консоль в объекте VBA WebBrowser, поэтому я использую weinre в качестве удаленного отладчика, но а) кажется, что она не выводит журналы и ошибки на консоль, если я не запускаю их в консоли, и б) он теряет связь, когда socket.io делает, и я мертв в воде.

Теперь, для полноты, если я удаляю вызовы.join() и вызовы.to(), все это работает так, как будто бы мы ожидаем, что все сообщения будут записаны в большую не закрытую комнату. Так что проблема с воссоединением комнат.

Как давний пользователь Stackru, я знаю, что длинный вопрос с очень небольшим количеством кода не одобряется, но в этой настройке нет абсолютно ничего особенного (что, вероятно, является частью проблемы). Он просто излучает и транслирует (от клиента). Я рад что-нибудь заполнить, основываясь на последующих вопросах.

1 ответ

Решение

Всем, кто может столкнуться с этим в будущем...

Ответ заключается в том, чтобы управлять переподключением вашей комнаты на стороне сервера вещей. Если ваш клиент не может установить надежные соединения или его часто отключают, обманите его, чтобы отслеживать комнаты на стороне сервера и присоединяться к ним, когда они подключаются.

Другим отрывком было то, что сервер чата и веб-интерфейс не были в одном домене, поэтому я не мог поделиться файлами cookie, чтобы узнать, кто подключается. В их случае не было необходимости размещать их в двух разных местах, поэтому я объединил их, попросил Express обслуживать пользовательский интерфейс, а затем, когда клиент обнаружился после принудительного отключения, я бы посмотрел на их cookie-файл с идентификатором пользователя, сопоставьте их с теми комнатами, в которых они находились, и я следил за ними на сервере и возвращался к ним.

Другие вопросы по тегам