【问题标题】:Cannot send message to all client that connected to the server (PHP Socket)无法向连接到服务器的所有客户端发送消息(PHP Socket)
【发布时间】:2017-05-15 08:37:56
【问题描述】:

我正在尝试向连接到服务器的所有客户端发送消息。我不断检查循环中的会话代码,当会话代码更改时,循环不会停止。如果对此有任何解决方案,我们将不胜感激。非常感谢。

这里是 server.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>

这里是client.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Client</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>
<form method="post" action="client.php">
<p><h4><label>Type Your Message Here:<input name = "message" size = "25" maxlength = "30" required></label></h4></p>
<input type="submit" name="sendmsg" class="btn btn-primary" value="send message"/>
</form>
<?php
ob_implicit_flush(true);
$user="abc";
if(empty($_POST)){

}
elseif(isset($_POST['sendmsg'])) {
$message =$_POST["message"];


$host    = "127.0.0.1";
$port    = 25011;

echo "Message To server :".$message;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");

$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  

socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");

while(true){
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
echo "Reply From Server  :".$result;
ob_flush();
if($result == "start"){
echo "Quiz Started";
ob_flush();
break;
}
}


socket_close($socket);


}


?>

</body>

</html>

这是change_session.php

<?php
session_start();
$_SESSION['pass_start_quiz'] = "yes";
?>

【问题讨论】:

    标签: php ajax sockets server client


    【解决方案1】:

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

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

    我对设计一些您希望进行套接字通信的东西的想法是让服务器设置套接字,并持续侦听任何新的客户端消息,然后执行一些操作。

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2013-11-10
      • 2015-06-20
      相关资源
      最近更新 更多