处于敌对网络环境中的Socket.io客房?

问题描述:

我有一个客户端的网络环境非常令人沮丧的问题,并且我希望有人能帮助我想出解决办法伸出援助之手......处于敌对网络环境中的Socket.io客房?

他们有现在被写入完全内部的应用的VBA for Excel。 (不笑)

我帮助他们改进产品和用户体验的部分内容涉及将其用户界面从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的长期用户,我知道很少有代码的长问题是不被接受的,但是这个设置(这可能是问题的一部分)绝对没有什么特别之处。这只是简单的发射和广播(从客户端)。我很高兴根据后续问题填写任何内容。

就可能在未来过这个人跑...

答案是管理上的事情在服务器端你的房间重新连接。如果你的客户端不能建立可靠的连接,或者断开了很多连接,那么跟踪服务器端的房间并在连接时加入它们的技巧就是诀窍。

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