-1

我已经构建了一个简单的 node.js 两页应用程序。一个大厅,一个游戏室。用户连接到大厅,然后在一张桌子旁坐下,游戏室在新窗口中打开。因此打开了两个浏览器窗口,它们都有自己的套接字连接。

一切都在我的电脑上运行良好。适用于所有浏览器,并且用户在游戏室中玩游戏时在大厅中保持连接,因为我正在来回发送信号。

但是,在我的 iPad 或 iPhone 上,当我打开游戏室时,与大厅的套接字连接会在短时间内结束。

是否有强制套接字连接在与计算机不同的设备上保持打开状态的最佳做法?

这是我在服务器上的代码:

编辑:当该浏览器窗口不再关注移动设备时,与大厅的连接实际上立即结束,只是超时本身发生在超时间隔之后。

这是我的调试输出:
got pong Player1
got pong Player1
got pong Player1 got
pong Player1
got pong
Player1 { username: 'Player2',
password: 'password',
browser_os: 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3' }
info - 握手授权 Ut2WHuhbDGsYzd6CRquX (玩家 2 登录并与大厅握手)
连接到大厅
got
pong Player1 got pong Player2 (第一个 pong 来自玩家 2)
信息 - 握手授权 If6MFT​​kJqv3T_Mn5RquY (游戏桌为玩家 2 打开 - 注意玩家 2 不再有乒乓球!!)
got pong Player1
got pong Player1
got pong
Player1 信息 - 握手授权 agmZNNSnce0h68NSRquZ(游戏桌为玩家 1 打开)
got pong Player1
got pong Player1
got pong Player1 got
pong Player1 got pong
Player1 got pong
Player1
got pong Player1
信息 - 传输结束(心跳超时)
大厅断开连接(玩家 2与大厅断开连接)
得到了 pong Player1

这是我的服务器端代码:

function sendHeartbeat(){
    setTimeout(sendHeartbeat, 8000);
    io.sockets.in('lobby1').emit('ping', { beat : '1' });
}

setTimeout(sendHeartbeat, 8000);

这是我的客户端代码:
socket.on('ping',function(msg){sendPong(msg)});

function sendPong(msg) {
    socket.emit('pong');
}
4

1 回答 1

0

这样做的技术和技术通常在Commet的总称下被提及,它基本上归结为强制浏览器在相对较长的时间内保持请求打开,等待来自服务器的更新。

HTML5 支持称为 Websockets 的功能,该功能允许更真实的 TCP/IP 套接字,在浏览器和服务器之间创建持久的双向连接。这可能是您最好的选择,因为大多数 Commet 技术基本上都是为了绕过 HTTP 和 Web 浏览器原本打算如何工作的本质(即发出小的、离散的请求而不是无限期地保持连接打开)。HTML5 Web 套接字旨在直接支持此功能。大多数现代浏览器都支持网络套接字,包括移动端(Android 除外,但我认为这很快就会出现)。node.js 有几个 web socket 包,包括WebSocket-Nodews。这是对Web 套接字的一个很好的介绍。

为什么你的代码在某些环境中运行而不是在其他环境中运行现在很难说。可能是浏览器缺乏支持。移动设备的浏览器功能往往不如台式机。我不确定移动 Safari 中对 Commet 或 HTML5 网络套接字的支持(看看这个)

请记住,这些技术中的任何一种都会在客户端和服务器上产生开销,以保持该连接处于打开状态。这也会影响可伸缩性,因为某些客户端绑定到某些服务器。

于 2013-10-25T20:49:39.587 回答