Большая задержка между stream_socket_server и stream_socket_client на одном компьютере - PullRequest
2 голосов
/ 24 декабря 2010

Когда я запускаю два приведенных ниже файла через командную строку (сначала запустите socket_server, затем socket_client), происходит долгая задержка (~ 60 с), прежде чем любой вывод отправляется сервером в socket_client. Есть ли способ уменьшить этот разрыв или какие-либо намеки на то, что вызывает проблему? Вот мои два фрагмента кода:

socket_client.php:

<?php
$fp = stream_socket_client("tcp://127.0.0.1:8000", $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
}
else {
       fwrite($fp, "2");
       echo fgets($fp, 1024);
    }
fclose($fp);
?>

socket_server.php:

<?php
$socket = stream_socket_server("tcp://127.0.0.1:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    while (!feof($conn)) {
          $result = fgets($conn, 1024);
        if($result = "2"){
                   fwrite($conn, "Hullo there");
                   }
        else{
            fwrite($conn, "Hullo here\n");
        }
    }
    fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
    fclose($conn);
  }
  fclose($socket);
}
?>

1 Ответ

3 голосов
/ 24 декабря 2010
  • Вы забыли отправить \n в конце некоторых из fwrite вызовов.Причина, по которой это вызвало проблему, заключается в том, что fgets ищет символ новой строки, прежде чем он вернется.
  • Я удалил цикл feof с сервера, поскольку клиент отправляет только одну строку.
  • Я добавил в клиент цикл feof для обработки нескольких строк, отправленных с сервера.
  • Я изменил if($result = на if ($result ==, потому что == является оператором сравнения (это то, что вына самом деле хотел).Внутри оператора if вы почти всегда хотите использовать == вместо =.

socket_client.php:

<?php

$fp = stream_socket_client("tcp://127.0.0.1:8000", $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "2\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
}
fclose($fp);

?>

socket_server.php:

<?php

$socket = stream_socket_server("tcp://127.0.0.1:8000", $errno, $errstr);
if (!$socket) {
    echo "$errstr ($errno)<br />\n";
} else {
    while ($conn = stream_socket_accept($socket)) {
        $result = fgets($conn, 1024);
        if ($result == "2\n") {
            fwrite($conn, "Hullo there\n");
        } else {
            fwrite($conn, "Hullo here\n");
        }
        fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
        fclose($conn);
    }
    fclose($socket);
}

?>
...