在恶意网络环境中的Socket.io房间?

时间:2014-09-24 20:18:33

标签: vba socket.io webbrowser-control socket.io-1.0 weinre

我对客户的网络环境有一个非常令人沮丧的问题,我希望有人可以帮助我解决这个问题......

他们有一个应用程序,现在完全是在VBA for Excel中编写的。 (不要笑。)

我帮助他们改善产品和用户体验的部分原因是将他们的UI从VBA表单元素转换为单个WebBrowser元素,该元素包含一个在Excel与其服务器之间进行通信的丰富Web应用程序。它主要通过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分钟)时,我尝试通过将onclick传递给触发脚本重新加入的HTML元素再次加入房间。奇怪的是,这不起作用。但是,如果我等待几秒钟并手动点击该对象,它会重新加入房间。是的,点击是从Excel文件收到的...我们看到消息到套接字服务器,但它不允许该调用重新加入房间。

这就是为什么这很难调试。在VBA的WebBrowser对象中无法看到控制台,所以我使用weinre作为远程调试器,但是a)它似乎不会将日志和错误输出到控制台,除非我在控制台中触发它们,并且b)当socket.io这样做时,它就失去了联系,我已经死在了水中。

现在,为了完整起见,如果我删除了.join()调用和.to()调用,它就会像我们期望的那样减去写入大型非私人房间的所有消息。所以这是重新加入房间的问题。

作为StackOverflow的长期用户,我知道很少有代码的长问题令人不悦,但这个设置绝对没什么特别的(这可能是问题的一部分)。它只是简单的发射和广播(来自客户端)。我很乐意根据后续问题填写任何内容。

1 个答案:

答案 0 :(得分:3)

对于将来可能会遇到这种情况的任何人......

答案是管理服务器端的房间重新连接。如果您的客户端无法建立可靠的连接,或者断开连接很多,那么就可以跟踪服务器端的房间并在连接时加入它们。

另一个问题是聊天服务器和Web UI不在同一个域中,所以我无法共享cookie以了解谁在连接。在他们的情况下,没有必要将它们托管在两个不同的地方,所以我将它们合并,让Express服务于UI,然后当客户端在强制断开连接后浮出水面时,我会查看他们的用户ID cookie,将它们与我们在服务器上跟踪的房间相匹配,然后重新加入它们。