2016-12-31 10 views
0

サーバに接続しているすべてのクライアントにメッセージを送信しようとしています。私はループ内のセッションコードをチェックし続け、セッションコードが変更されたときには、ループは停止しません。これに関する解決策があれば感謝します。どうもありがとう。ここサーバ(PHPソケット)に接続しているすべてのクライアントにメッセージを送信できません

はここ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> 

これは、あなたがあなたのループを設計しているように見えます

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

答えて

0

change_session.phpです決して止まらない。しかし、ループ内に条件付き実行文があることがわかります。

ソケットサーバーを設定して接続してから書き込みを行うようですが、すべてがclient.php内にあります。したがって、これは送信時に実行され、破棄されます。

ソケット通信を行う場所を設計する際には、ソケットを設定し、新しいクライアントメッセージを常に聞き取り、何らかのアクションを実行するサーバーを用意することが考えられます。

また、ステートレスWebベースのAJAXパターンを使用しているようです。おそらく、ただ1つの形式のコミュニケーションで標準化することを再考することは価値があるでしょう。 AJAXはブラウザがサーバーと通信するためのステートレスなHTTPベースの方法ですが、サーバーはHTTPリクエストを使用してエンドポイントと通信することもできます。情報をストリーミングする必要がないか、永続的な接続を維持する必要がない場合は、TCPソケットが最良のプロトコルではない可能性があり、問題を混乱させる可能性があります。

希望すると便利です。

関連する問題