Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Socket.io文件室是否处于敌对网络环境中?_Vba_Socket.io_Webbrowser Control_Socket.io 1.0_Weinre - Fatal编程技术网

Vba Socket.io文件室是否处于敌对网络环境中?

Vba Socket.io文件室是否处于敌对网络环境中?,vba,socket.io,webbrowser-control,socket.io-1.0,weinre,Vba,Socket.io,Webbrowser Control,Socket.io 1.0,Weinre,我在客户的网络环境中遇到了一个非常令人沮丧的问题,我希望有人能帮我解决这个问题 他们有一个应用程序,目前完全是在VBA for Excel中编写的。(别笑了。) 我帮助他们改进产品和用户体验的部分工作涉及将他们的UI从VBA表单元素转换为单个WebBrowser元素,其中包含一个丰富的web应用程序,该应用程序可在Excel和服务器之间进行通信。它主要通过socket.io服务器/连接来实现这一点 当用户登录时,会连接到套接字服务器上的房间 最初的“所有者”名称: socket.on('crea

我在客户的网络环境中遇到了一个非常令人沮丧的问题,我希望有人能帮我解决这个问题

他们有一个应用程序,目前完全是在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);
    });
});
后续“参与者”呼叫:

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元素传递onclick来再次加入会议室。奇怪的是,这不起作用。但是,如果我等待几秒钟并手动单击对象,它确实会重新加入房间。是,正在从Excel文件接收单击。。。我们看到发送给套接字服务器的消息,但它不允许该调用重新加入房间

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

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


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

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

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

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