我有 JavaScript 通过 WebSocket 连接在窗口上发送鼠标的坐标。
var webSocket = new WebSocket('ws:// ...');
$(window).mousemove(function (evt) {
webSocket.send(evt.pageX + ' ' + evt.pageY);
});
然后,我的后端 PHP 只是简单地监听这些坐标并将光标的位置发送给所有连接的人。
//whenever someone sends coordinates, all users connected will be notified
foreach ($webSocket->getUsers() as $user)
$user->send($xpos . ' ' . $ypos);
JavaScript 获取这些数字并根据这一点移动一个红色方块。
//when PHP notifies a user, the square is updated in position
$('.square').css({
left: xpos,
top: ypos
});
最终产品如下所示:
现在的问题是它非常滞后,但我找到了解决这个问题的方法。我为 JavaScript 添加了一个间隔——它每 50 毫秒发送一次填充数据。
setInterval(function() {
webSocket.send('filler data');
}, 50);
令人惊讶的是,更改使它变得更加顺畅:
我注意到左侧(鼠标移动的地方)总是很平滑,我猜是因为左边的窗口总是发送数据,所以连接保持更平滑,而右边的窗口只有接收数据。
我试过了:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, TCP_NODELAY, 1);
var_dump(socket_get_option($socket, SOL_SOCKET, TCP_NODELAY));
输出是int(-1)
,而且似乎 Nagle 的算法仍然存在于我的应用程序中。
有点相关,设置 TCP_NODELAY 会影响套接字两端的行为吗?,这可能是JavaScript故意延迟数据包的问题?
- 为什么发送东西会使事情变得更顺畅?
- 有没有办法可以加快速度,而不必发送无用的数据?