Длинная задержка между stream_socket_server и stream_socket_client на одном компьютере
Когда я запускаю два приведенных ниже файла через командную строку (сначала запустите 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 ответ
Решение
- Вы забыли отправить
\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);
}
?>