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