1

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

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

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

这就是使调试变得非常困难的原因。无法在 VBA 的 WebBrowser 对象中看到控制台,因此我使用 weinre 作为远程调试器,但是 a)它似乎不会将日志和错误输出到控制台,除非我触发它们在控制台中发生,并且 b)当 socket.io 断开连接时,它会失去连接,而我已经死在水中了。

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

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

4

1 回答 1

3

对于将来可能遇到此问题的任何人...

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

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

于 2014-09-30T17:25:52.673 回答