1

欲望:ソケットに接続し、毎秒「実行中」をクライアントに送信したい。

もちろんこれはテストです。

問題:出力「実行中」は、クライアントがデータを送信するときにのみ送信されます。クライアントが書き戻すのを待ってループが一時停止しているようです。

コード:

$socket = @socket_create_listen("12345");

while (true) {
    $client = socket_accept($socket);
    $msg = "\nHello"."\r\n".chr(0);
    $length = strlen($msg);
    socket_write($client, $msg,$length);
    usleep(5);

    while (true) {
        $msg = 'running'."\r\n".chr(0);
        $length = strlen($msg);
        socket_write($client, $msg, $length);
        sleep(1);
    }
}

例:上記のコードは、サーバー上のファイルにあります。このファイルを実行し、telnet を使用してポート 12345 でサーバーに接続するとtelnet myip# 12345、コンソールに毎秒「実行中」と表示されるはずでした。代わりに、「実行中」は一度だけ書き込まれます。コンソールに何かを入力すると (サーバーにデータを書き込むなど)、running が再び表示されます。したがって、サーバーに何かを送信すると、コンソールにのみ送信されます。

何が原因でしょうか?

ありがとうございます

4

2 に答える 2

2

サーバーは問題ないようです。問題はクライアントにある可能性が最も高いです。私はあなたのサーバーを微調整し、テストに成功するクライアントを作成しました。私の微調整は、ソケットが閉じていることを確認することでした。そうしないと、連続ループに陥ります。

ここにsocketserver.phpがあります

echo "Starting Server" . "\n\r";
$socket = @socket_create_listen("55000");
while (true) {
    $client = socket_accept($socket);
    $msg = "\nHello"."\r\n".chr(0);
    $length = strlen($msg);
    socket_write($client, $msg,$length);
    usleep(5);

    while (true) {
        $msg = 'running'."\r\n".chr(0);
        $length = strlen($msg);
        $test  = socket_write($client, $msg, $length);
        sleep(1);
        if ($test === false) {
            echo "socket probably closed\n";
            exit;
        }

    }
}

ここにsocketclient.phpがあります

$address = '127.0.0.1';
$port = 55000;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit;
}

echo "\nStarting client";
echo "\nAttempting to connect to '$address' on port '$port'...";
$result = socket_connect($socket, $address, $port);
echo "\n\nReading responses...\n\n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

echo "\nClosing socket...";
socket_close($socket);

これが結果のスクリーンショットです。

PHP クライアント サーバーの例

これはテストであることは承知していますが、UDP を使用して設計された定期的なステータス サーバーの方がはるかに理にかなっていることに注意してください。

于 2013-08-25T01:17:33.597 に答える
1

他のクライアントを使用してみましたか? nc (netcat) はテストに最適です。また、サーバーがデータを送信したときに (画面またはファイルに) ログを記録するように、サーバーに出力を入れます。

サーバーは正常に動作していると思いますが、クライアントは何らかの形で台無しになっています。入力するだけnc <my_ip> 12345で、何が得られるかを確認できます。

telnet は実際のプロトコル ( https://www.rfc-editor.org/rfc/rfc854 ) であるのに対し、nc は単純な TCP であることを思い出してください。

また、文字列を終了する NUL が奇妙な問題を引き起こしている可能性があります。chr(0) ビットをなくして、改善されるかどうかを確認します。

于 2013-08-25T01:11:56.190 に答える