Как повторно отправлять запросы и принимать по TCP?

IlayVanse

Здравствуйте! Помогите, пожалуйста. Нашел пример клиента TCP:

PHP:
  1. <?php
  2.  
  3. echo “<h2>Соединение TCP/IP</h2>n;
  4.  
  5. /* Получаем порт сервиса WWW. */
  6. $service_port = 1234;
  7.  
  8. /* Получаем IP-адрес целевого хоста. */
  9. $address = ‘0.0.0.0’;
  10.  
  11. /* Создаём сокет TCP/IP. */
  12. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  13. if ($socket === false) {
  14.     echo “Не удалось выполнить socket_create(): причина: “ . socket_strerror(socket_last_error()) . n;
  15. } else {
  16.     echo “OK.n;
  17. }
  18.  
  19. echo “Пытаемся соединиться с ‘$address‘ на порту ‘$service_port‘…”;
  20. $result = socket_connect($socket, $address, $service_port);
  21. if ($result === false) {
  22.     echo “Не удалось выполнить socket_connect().nПричина: ($result) “ . socket_strerror(socket_last_error($socket)) . n;
  23. } else {
  24.     echo “OK.n;
  25. }
  26.  
  27. $in = “helprn;
  28. $out = ;
  29.  
  30. echo “Отправляем HTTP-запрос HEAD…”;
  31. socket_write($socket, $in);
  32. echo “OK.n;
  33.  
  34. echo “Читаем ответ:nn;
  35. while ($out = socket_read($socket, 2048)) {
  36.     echo $out;
  37. }
  38.  
  39. echo “Закрываем сокет…”;
  40. socket_close($socket);
  41. echo “OK.nn;
  42. ?>

Когда мне надо повторно отправить запрос и получить сразу же от сервера ответ, то ничего не приходит. Могу только первый раз отправить и получить.
Пример как я это пытаюсь сделать:

PHP:
  1. $in = “helprn;
  2. $out = ;
  3.  
  4. echo “Отправляем HTTP-запрос HEAD…”;
  5. socket_write($socket, $in);
  6. echo “OK.n;
  7.  
  8. echo “Читаем ответ:nn;
  9. while ($out = socket_read($socket, 2048)) {
  10.     echo $out;
  11. }
  12.  
  13. $in = “helprn;
  14.  
  15. echo “Отправляем HTTP-запрос HEAD…”;
  16. socket_write($socket, $in);
  17. echo “OK.n;
  18.  
  19. echo “Читаем ответ:nn;
  20. while ($out = socket_read($socket, 2048)) {
  21.     echo $out;
  22. }

В чем моя ошибка, как мне не один раз получать/отправлять на сервер?

 

ADSoft

может закрывать стоит сокеты и открывать заново после каждой отправки запроса и получения ответа?

 

acso

Гм, 5 секунд гугления говорят, как обслуживать сокеты: https://www.php.net/manual/ru/sockets.examples.php
Вы забыли про петлю. После выполнения кода он просто завершается.

 

IlayVanse

При каждом новом подключении, сервер создает как бы новую сессию. Вариант “каждый раз с новым сокетом” невозможен.
— Добавлено —

Можете, пожалуйста, уточнить про “петлю”?

 

acso

Я про цикл. В Вашем коде выполнение происходит один раз и сокет закрывается. Вам же нужно сокет держать и проверять, есть ли новые данные.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *