我目前正在编写一个网络游戏的通信框架,通信图如下所示: 代码如下:
test.php:
<!DOCTYPE html>
<html>
<head>
<title> Test </title>
<script>
function init()
{
var source = new EventSource("massrelay.php");
source.onmessage = function(event)
{
console.log("massrelay sent: " + event.data);
var p = document.createElement("p");
var t = document.createTextNode(event.data);
p.appendChild(t);
document.getElementById("rec").appendChild(p);
};
}
function test()
{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
{
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200)
{
console.log("reciver responded: " + xhr.responseText);
}
}
xhr.open("GET", "reciver.php?d=" + document.getElementById("inp").value , true);
xhr.send();
console.log("you sent: " + document.getElementById("inp").value);
}
</script>
</head>
<body>
<button onclick="init()">Start Test</button>
<textarea id="inp"></textarea>
<button onclick="test()">click me</button>
<div id="rec"></div>
</body>
</html>
此功能接收用户输入(目前仅为测试的文本框),并将其发送至接收器,之后将接收器的响应写回到控制台中。我从未遇到过来自接收器的错误。此外,它还会为所发送的SSE添加事件侦听器。
reciver.php:
<?php
$data = $_REQUEST["d"];
(file_put_contents("data.txt", $data)) ? echo $data : echo "error writing";
?>
正如您所看到的,这很简单,只是将数据写入data.txt,然后发送回写入成功的消息。data.txt只是数据传递到massrelay.php的“管道”。
massrelay.php:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(1)
{
$data = file_get_contents("data.txt");
if ($data != "NULL")
{
echo "data: " . $data . "\n\n";
flush();
file_put_contents("data.txt", "NULL");
}
}
?>
massrelay.php用于检查data.txt中是否有数据,如果有,则通过SSE将其传递给任何监听它的事件侦听器的人,一旦读取数据,它将清除数据文件。
整个过程实际上是完美的,除了一个小问题:massrelay.php发送数据可能需要从30秒到10分钟。对于Web游戏来说,这完全无法接受,因为你需要实时操作。我想知道这是否是由于我的代码存在缺陷还是硬件问题(在2006年的Dell上托管,具有Sempron处理器)。如果有人看到任何问题,请告诉我,谢谢。
usleep(1000)
会发生什么?我只能猜测while(1){file_get_contents();}
会对您的机器造成压力。 - Peterwhile(1) { echo "test"; flush(); sleep(3); }
,会发生什么? - Peteroutput_buffering
。我经常很难强制执行flush
,可以参考 https://dev59.com/Qm445IYBdhLWcg3wws8u。 - Peter