2014-07-13 53 views
-2

我试图创建一个脚本来ping我的Minecraft服务器,以检查有多少玩家在线,但由于某种原因,问号正在显示,并且它使整个网站看起来像废话。这是我的PHP文件。JavaScript中的奇怪问号

<script> 
    function setOnline(online,max) { 
     var on = online; 
     var mx = max; 

     var main = document.getElementById('status_main'); 
     main.className = "panel panel-success server-status"; 

     var title = document.getElementById('status_title'); 
     title.innerHTML = "Online"; 

     var body = document.getElementById('status_body'); 
     body.innerHTML = on + "/" + mx + " Players Online"; 
    } 
</script> 

<script> 
    function setOffline() { 
     var bar = document.getElementById('status'); 
     bar.className = "panel panel-danger server-status"; 
     bar.text = "Offline"; 
    } 
</script> 
<?php 
$host = "localhost"; //IP/host of Minecraft server 
$port = 25565; //Minecraft server port, not query port 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //Create the socket 
$connected = socket_connect($socket, $host, $port); //Try and connect using the info provided above 
if (!$connected) 
    die(); //No connection could be established 

socket_send($socket, "\xFE\x01", 2, 0); //Send the server list ping request (two bytes) 
$retVal = socket_recv($socket, &$data, 1024, 0); //Get the info and store it in $data 
socket_close($socket); //Close socket 

if ($retVal != false && substr($data, 0, 1) == "\xFF") //Ensure we're getting a kick message as expected 
{ 
    $data = substr($data, 9); //Remove packet, length and starting characters 
    $data = explode("\x00\x00", $data); //0000 separated info 
    $protocolVersion = $data[0]; //Get it all into separate variables 
    $serverVersion = $data[1]; 
    $motd = $data[2]; 
    $playersOnline = $data[3]; 
    $playersMax = $data[4]; 
    echo ("<script>setOnline('$playersOnline','$playersMax');</script>"); 
} 
else 
{ 
    die(); 
} 
?> 

下面是结果看起来,当它被称为像: http://cl.ly/image/3o2f3P121q0m

我怎样才能摆脱问号?

+2

我想你没有正确清理字符串。它似乎仍然包含元数据,或者您没有提取正确的数据。您可以摆脱问题标记提取正确的数据。 –

+0

你可以给每个角色在$ playersOnline和$ playersMax的字符代码和你期望的值吗? – NickSlash

+0

你说的是“0000分开的信息”,但你的'explode'中只有两个“nul”字符。 –

回答

0

这可能是一个字符集问题。信息没有按照编码的方式呈现。

您可以通过var_dump $ data查看其内容类型。


这里只是一个假设:实际编码是ISO-8859-1,但它被解释为UTF-8(或UTF-16)。

为了让浏览器中使用正确的编码,你可以添加一个HTTP标头:

header("Content-Type: text/plain; charset=ISO-8859-1"); 

或使用meta标签。

+0

使用$ playersOnline = var_dump(data [3]);只是将'string(2)“9”'添加到我网站的左下角。 –

+0

对不起,如果我没有得到基本的概念,我对此很新。感谢您耐心等待我=) –

+0

@josephmandex var_dump整个$ data,而不仅仅是$ data [3]。它应该看起来类似于HTTP/1.1 200 OK Date:Mon,14 Sep 2009 08:56:36 GMT Server:Apache/2.2.3(Red Hat) Last-Modified:Tue,2005年11月15日13:24 :10 GMT ETag:“b80f4-1b6-80bfd280” Accept-Ranges:bytes Content-Length:438 Connection:close Content-Type:text/html; charset = UTF-8' –