2016-12-31 73 views
0

我想向連接到服務器的所有客戶端發送消息。我不斷地檢查循環中的會話代碼,當會話代碼改變時,循環不會停止。讚賞如果有任何解決方案。非常感謝。無法發送消息給連接到服務器的所有客戶端(PHP Socket)

這裏是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"; 
?> 

回答

0

它看起來像你設計你的循環來永不止步。然而,我發現循環內有一個條件執行語句。

似乎你正在設置一個套接字服務器,連接到它然後寫入它,但都在client.php中。所以這將在提交後執行,然後丟棄。

我在設計你想要套接字通信的地方將有它設置了插座,並持續監聽任何新客戶端的消息,然後執行某些操作的服務器什麼的想法。

它也顯示您正在使用基於Web的無狀態AJAX模式。也許重新思考只採用一種形式的溝通標準是值得的。 AJAX是瀏覽器與服務器進行通信的基於HTTP的無狀態方法,但服務器也可以使用HTTP請求與您的端點通信。如果您不需要流式傳輸信息或維護持續連接,則TCP套接字可能不是最好的協議,可能會造成混淆。

希望這會有所幫助!

相關問題