我正在编写一个多用户、基于 JavaScript 的绘图应用程序作为学习项目。现在这是一种方式:当用户在 HTML5 画布元素上绘制时,transmitter.html 上的“发送者”客户端发送数据,receiver.html 上的“接收者”客户端将其复制到他们自己的画布上。
发送器只是在 (previousX, previousY) 和 (currentX, currentY) 之间画一条线以响应 mouseMove 事件。它通过AJAX 将这两组坐标发送到transmitter.php。它们坐在会话变量中,直到接收者通过调用receiver.php(也通过AJAX)收集它们。至少它应该是这样工作的。
这是发射器.php:
<?php
session_start();
if (!isset($_SESSION['strokes'])) $_SESSION['strokes'] = '';
$_SESSION['strokes'] .= $_GET['px'] . "," . $_GET['py'] . "," . $_GET['x'] . "," . $_GET['y'] . ';';
?>
这是receiver.php:
<?php
session_start();
echo($_SESSION['strokes']);
$_SESSION['strokes'] = "";
?>
如果您想知道我为什么要使用会话变量,那是因为它是我能想到的以其他脚本可以访问数据的方式存储数据的最快方式。我尝试在谷歌上搜索替代品,但找不到任何东西。如果有更好的方法,我很想听听。
无论如何,问题在于并非所有数据都能通过。这通过在接收者画布上绘制的线条中的间隙表现出来。我还在发送器和接收器的 JavaScript 文件中设置了一个小计数器,以准确检查发送/接收了多少“笔划”。收到的总是少于发送的,因此数据似乎在服务器端丢失。
冒着给你的代码比你需要看到的更多的风险,这是发送器.js中的代码,它将数据发送到服务器(n是我提到的计数器):
function mouseMoveHandler(e)
{
var x = e.pageX - canvasX;
var y = e.pageY - canvasY;
if (mouseDown)
{
canvas.moveTo(prevX, prevY);
canvas.lineTo(x, y);
canvas.stroke();
sendToServer(prevX, prevY, x, y);
n++;
}
prevX = x;
prevY = y;
}
这是接收器中将其取回并绘制它的代码(同样,n 是计数器):
function responseHandler()
{
if (xhr.readyState == 4)
{
var strokes = xhr.responseText.split(';');
n += strokes.length - 1;
for (var i = 0; i < strokes.length - 1; i++)
{
stroke = strokes[i].split(',');
canvas.moveTo(stroke[0], stroke[1]);
canvas.lineTo(stroke[2], stroke[3]);
canvas.stroke();
}
setTimeout("contactServer()", 500);
}
}