Комнаты 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-файл с идентификатором пользователя, сопоставьте их с теми комнатами, в которых они находились, и я следил за ними на сервере и возвращался к ним.