Как повторно отправлять запросы и принимать по 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 не будет опубликован. Обязательные поля помечены *