我已经构建了一个简单的node.js 2页应用程序。大堂和游戏室。用户连接到大厅,然后坐在桌子旁,游戏室在新窗口中打开。因此打开两个浏览器窗口,两个都有自己的套接字连接。
我的电脑上的一切都很棒。适用于所有浏览器,并且当用户在游戏室中玩游戏时,用户在大厅中保持连接,因为我来回传递信号。
然而,在我的iPad或iPhone上,当我打开游戏室时,大厅的插座连接会在很短的时间后结束。
是否有最佳做法强制套接字连接在与计算机不同的设备上保持打开状态?
这是我在服务器上的代码:
编辑:当浏览器窗口不再关注移动设备时,与大厅的连接实际上立即结束,只是超时本身在超时间隔之后发生。
这是我的调试输出:
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
{username:'Player2',
密码:'密码',
browser_os:'Mozilla / 5.0(iPad; CPU OS 5_1_1,如Mac OS X)AppleWebKit / 534.46(KHTML,如Gecko)版本/ 5.1 Mobile / 9B206 Safari / 7534.48.3'}
info - 握手授权Ut2WHuhbDGsYzd6CRquX(玩家2登录并握手大堂)
连接到大厅
得到了乒乓球1
得到了乒乓球Player2(来自玩家2的第一个乒乓球)
info - 握手授权If6MFTkJqv3T_Mn5RquY(游戏桌为玩家2打开 - 注意玩家2没有更多的P !!)
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
info - 握手授权agmZNNSnce0h68NSRquZ(为玩家1打开游戏桌)
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
得到了乒乓球1
info - 传输结束(心跳超时)
大厅断开(玩家2与大厅断开连接)
得到了Pong Player1
这是我的服务器端代码:
function sendHeartbeat(){
setTimeout(sendHeartbeat, 8000);
io.sockets.in('lobby1').emit('ping', { beat : '1' });
}
setTimeout(sendHeartbeat, 8000);
这是我的客户端代码:
socket.on( '平',函数(MSG){sendPong(MSG)});
function sendPong(msg) {
socket.emit('pong');
}
答案 0 :(得分:0)
执行此操作的技术和技术通常在保守术语Commet下引用,这基本上归结为强制浏览器在相对较长的时间内保持请求打开,等待来自服务器的更新。 / p>
HTML5支持一种名为Websockets的功能,它允许更真实的TCP / IP套接字,在浏览器和服务器之间创建持久的双向连接。这可能是您最好的选择,因为大多数Commet技术基本上都是为了解决HTTP和Web浏览器最初的工作原理(即,制作小的,离散的请求而不是无限期地保持连接打开)。 HTML5 Web套接字旨在直接支持此功能。大多数现代浏览器support web sockets,包括移动浏览器(Android除外,但我认为即将推出)。 node.js有几个web套接字包,包括WebSocket-Node和ws。这是一个good intro到网络套接字。
为什么你的代码在某些环境中工作而其他环境在这一点上很难说。它可能是浏览器缺乏支持。移动设备往往具有比台式机更低功能的浏览器。我不确定移动Safari(have a look at this))对Commet或HTML5网络套接字的支持。
请记住,任何这些技术都会在客户端和服务器上产生开销,以保持该连接的开放。这也会影响可伸缩性,因为某些客户端绑定到某些服务器。