处于敌对网络环境中的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,将它们与我在服务器上跟踪的房间相匹配,然后重新加入。