无法向连接到服务器的所有客户端发送消息(PHP Socket)

时间:2016-12-31 07:46:11

标签: php ajax sockets server client

我正在尝试向连接到服务器的所有客户端发送消息。我一直在循环中检查会话代码,当会话代码改变时,循环不会停止。感谢是否有任何解决方案。非常感谢。

这是server.php

<?php
if( rand(0, 999) === 534 ){
    $blnContinue = false;
}
?>

这是client.php

1>Starting deploy 5" Marshmallow (6.0.0) XHDPI Phone ...
1>Starting emulator 5" Marshmallow (6.0.0) XHDPI Phone ...
1>Validating emulator arguments...
1>Determining if emulator is already running...
1>Preparing virtual machine...
1>Launching emulator...
1>Emulator launched successfully.

这是change_session.php

<?php
session_start();
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Server</title>
<link rel="stylesheet" href="../bootstrap-3.3.7/docs/dist/css/bootstrap.min.css">
<script src="../bootstrap-3.3.7/docs/assets/js/vendor/jquery.min.js"></script>
<script src="../bootstrap-3.3.7/docs/dist/js/bootstrap.min.js"></script>
</head>
<body>
<h1>Server</h1>

<button id="start_button" class="btn btn-primary" >Start Quiz</button>

<script type="text/javascript">

document.getElementById("start_button").addEventListener("click", write_to_all);

function write_to_all(){
$.ajax({
            type: "GET",
            url: "change_session.php" ,

        });
}
</script>

<?php
$_SESSION['pass_start_quiz'] = "no";

$i=0;
$spawn = array();

error_reporting(0);
set_time_limit(0);
ob_implicit_flush(true);
$host = "127.0.0.1";
$port = 25011;
$start="no";

echo "Waiting for connections... \n";
ob_flush();
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

$result = socket_listen($socket) or die("Could not set up socket listener\n");

while(true){

$spawn[++$i] = socket_accept($socket) or die("Could not accept incoming connection\n");
echo "\n";
$input = socket_read($spawn[$i], 1024) or die("Could not read input\n");
if($input=='q'){break;}
$input = trim($input);
echo $input ."\n";
ob_flush();
$output = "hello client";
socket_write($spawn[$i], $output, strlen ($output)) or die("Could not write output\n");
ob_flush();
$start_quiz= $_SESSION["pass_start_quiz"];
echo $start_quiz;

if($start_quiz == "yes"){
    echo $start_quiz;
    $output = "start";
    $arrlength = count($spawn);
    echo $arrlength;
    ob_flush();
    for($x = 0; $x < $arrlength; $x++) {
    socket_write($spawn[$x], $output, strlen ($output)) or die("Could not write output\n");
}
    break;
}

}
socket_close($spawn);
socket_close($socket);
?>




</body>
</html>

1 个答案:

答案 0 :(得分:0)

看起来你设计的循环永不停止。我看到循环中有一个条件执行语句。

您似乎正在设置套接字服务器,连接到它然后写入它,但都在client.php中。所以这将在提交时执行,然后丢弃。

我想要设计一些你希望进行套接字通信的东西,就是拥有一个设置套接字的服务器,并持续监听任何新的客户端消息,然后执行一些操作。

您似乎也在使用基于无状态网络的AJAX模式。或许重新思考只对一种沟通方式进行标准化是值得的。 AJAX是一种基于HTTP的无状态方法,用于浏览器与服务器通信,但服务器也可以使用HTTP请求与端点通信。如果您不需要流式传输信息或维持持久连接,则TCP套接字可能不是最佳协议,并且可能会引起混淆。

希望这有帮助!