3

したがって、このサーバーコードがあり、クライアントで動作します。ただし、クライアントから 1 つのメッセージを取得し、逆方向にメッセージを送り返します。コードは次のとおりです: SERVER.php

<?php 

    $host = "127.0.0.1"; 
    $port = 1234; 

    // don't timeout! 
    set_time_limit(0); 

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

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

    // start listening for connections 
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    // clean up input string 
    $input = trim($input); 

    // reverse client input and send back 
    $output = strrev($input) . "\n"; 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 

    // close sockets 
    socket_close($spawn); 
    socket_close($socket); 

?>

このコードを継続的に実行できるように編集するにはどうすればよいですか? もちろん、クライアントは稼働している必要はありません。新しいソケットを開き、メッセージを送信し、サーバーからメッセージを取得してソケットを閉じるだけです。次回メッセージを送信するときは、前の手順をもう一度実行します。

メッセージを送信してサーバーから応答を受け取ると、両方ともソケットを閉じます。ソケットを閉じて新しい接続を待たないようにサーバー側を変更するのを手伝ってください。

while ループを追加しようとしましたが、クライアントが閉じるとすぐに、サーバーはクライアントから読み取れなくなったと言って再び閉じます。

ありがとう

4

4 に答える 4

6

私はそれを考え出した。あなたのほとんどは、while() ループを使用して、私のように解決に近づいていました。ただし、コードを while の中に入れて、それが機能することを期待することはできません。それを行う正しい方法は次のとおりです。

<?php 
$host = "127.0.0.1"; 
$port = 1234; 

// don't timeout! 
set_time_limit(0); 

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

// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
    while(true) {
    // start listening for connections 
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    // clean up input string 
    $input = trim($input); 

    // reverse client input and send back 
    $output = strrev($input) . "\n"; 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 
    }
// close sockets 
socket_close($spawn); 
socket_close($socket); 

?>

while を他の場所に置こうとすると、エラーが発生します。 みんな助けてくれてありがとう:D

于 2013-03-07T21:35:32.037 に答える
0

受け入れた後、フォークする必要があります-ここを参照してくださいhttp://php.net/manual/en/function.pcntl-fork.php

受け入れはループにする必要があります。そのクライアントを処理するプロセスを fork した後。

すなわち

while (TRUE)
{
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    $pid = pcntl_fork();
    if ($pid == -1) {
         die('could not fork');
    } else if ($pid) {
         // we are the parent
         socket_close($spawn);
    } else {
         // we are the child
         // Use $spawn for communication as you see fit
         // exit();
    }    
}

ゾンビ プロセスを整理するには、シグナル ハンドラを使用する必要があります。

于 2013-03-06T22:26:56.223 に答える
-1

「野蛮な」方法は、コードを無限ループに挿入することです。

While(1){
     .
     .
 }

または、メッセージを受信した後、スクリプトを繰り返し呼び出すことができます。

于 2013-03-06T22:20:58.337 に答える
-1
  while( TRUE ) {

      // your code


  }
于 2013-03-06T22:41:39.387 に答える