2

在我当前的项目中,我发现在移动设备上使用带有 socket.io 和 node.js 的 websockets 存在问题。移动设备在间隔内处理套接字消息似乎存在问题。

我将其简化为最小的场景:

服务器(最小的 express.js 服务器)以特定的时间间隔向客户端发送消息:

setInterval(function(){
  socket.emit('interval');
}, 500);

客户端只是弄乱收到消息之间的时间并显示它们:

socket.on('interval', function (data) {
  timeElement.html(new Date() - startTime);
  startTime = new Date();
});

desktop(使用 Chrome)上,消息之间产生的时间非常稳定,在515 ms. 所以它就像一个 15 毫秒的延迟,但消息间隔是一致的。

在一个mobile device(我正在使用带有 Chrome 的 Galaxy Nexus)上,时间会随着between 400 and 600 ms任何一种方式出现更多的极端峰值而变化。

我想使用这样的间隔作为游戏回合指示器,这个问题导致移动设备上的玩家移动很多滞后和不均匀。

4

2 回答 2

0
  1. 有些代理不允许 Web 套接字连接,所以如果它不允许,那么您需要切换到 HTTP。
  2. 由于移动网络不可靠,您的 web socket 可能不活跃,最好在某个特定时间段内继续检查连接是否处于活动状态。如果不是,则建立新的连接。
于 2014-08-29T21:58:32.973 回答
0

您无法保证网络数据包何时会到达您的手中。如果您没有使用像 TCP 这样的可靠协议,则无法确定数据包是否会到达您手中。有时数据包会被丢弃。

碰巧的是,您使用的是 TCP(它是 WebSockets 的底层网络级协议)。当 TCP 数据包丢失时,网络必须识别丢失,然后重新发送数据包,从而造成延迟。移动设备的物理网卡可能比桌面上的物理网卡更容易丢包。

网络消息间隔是可靠定时的糟糕机制。

另一个 - 或额外 - 可能的解释(如果您怀疑数据包丢失不太可能)是在这样一个低功耗的移动设备上,网络驱动程序根本没有在 CPU 上获得足够的时间(或者没有得到它的 CPU时间很快),因此在处理物理网络设备上接收的数据包队列时存在驱动程序级别的延迟。

于 2013-08-14T14:05:36.723 回答