我对客户的网络环境有一个非常令人沮丧的问题,我希望有人能帮我解决这个问题......
他们有一个应用程序,目前完全在 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 的长期用户,我知道一个包含很少代码的冗长问题是不受欢迎的,但这种设置绝对没有什么特别之处(这可能是问题的一部分)。它只是简单的发射和广播(来自客户端)。我很乐意根据后续问题填写任何内容。