Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: PHP работа с сокетами
Форумы портала PHP.SU » » Работа с сетью » PHP работа с сокетами

Страниц (1): [1]
 

1. sphinks - 18 Июля, 2011 - 15:21:55 - перейти к сообщению
Задача:
1.Подсоединиться к серверу на указанный порт (соединение ssl приветствуется).
2. Послать сообщение на сервер.
3. Получить ответ.
4. Оставить соединение открытым, т.к. сервер через некоторое (неопределенное время от 1секунды до 10 минут) начинает высылать сообщения.
5. Получить все сообщения, расшифровать.
6. Отправить ответ, что сообщения получены. Всем спасибо.
7. Закрыть соединение.

Решение:
PHP:
скопировать код в буфер обмена
  1.  
  2. $addr='mysite.com';
  3. $port=1983;
  4. //открываем соединение
  5. $fp=fsockopen($addr,$port,$errno, $errstr, 10);
  6. //если не соединилось - говорим об этом, иначе продолжаем работу
  7. if(!$fp){
  8.   echo 'Cannot to connect to server: $errstr ($errno)<br><br>';
  9. }else{
  10.   echo '<br>Connected to server....Ok<br>';
  11.   $message='<StartTest testnr="1" timestamp="600000"/>';
  12.   //высылаем сообщение серверу
  13.   fputs ($fp,$message);
  14.   echo 'Message sent.....Ok<br>';
  15.   echo 'Server answer...';
  16.   // получаем ответ
  17.   while (!feof($fp)) {
  18.      echo fgets($fp,100000);
  19.      echo '<br>';
  20.   }
  21. }
  22.  

И дальше начинаются проблемы (( Чтоб не закрывать соединение я не делаю fclose($fp); Но и не получаю ничего (( Есть ли какие-либо идеи, что можно сделать, чтоб решить задачу? Может как-то можно обновлять соединение, когда с сервера отправляются данные?
Как я понял, сокет работает так: Сервер - клиент. На серверной части работает слушатель, который реагирует на запросы клиента. Но как заставить клиента среагировать на передачу данных с сервера?
В голову приходит идея сделать так:
PHP:
скопировать код в буфер обмена
  1. while ($fp){
  2.   while (!feof($fp)) {
  3.      echo fgets($fp,100000);
  4.      echo '<br>';
  5.   }
  6. }

т.е. ждем ответа, пока открыто соединение.
2. sphinks - 02 Августа, 2011 - 17:55:48 - перейти к сообщению
Помогите разрешить проблему:
в телнете задаю коннект - соединяется с сервером по заданному порту. При отсылке сообщения, получаю ответ.
А как это описать в ПХП?
3. sphinks - 17 Августа, 2011 - 18:52:40 - перейти к сообщению
Хе, спасибо всем за помощь. Хорошо, пальцы, клавиатура и инет работают.
Итак, вот реализация клиента для подключения к серверу
PHP:
скопировать код в буфер обмена
  1. $server = 'test.server';
  2. $port = 1982;
  3. $smes = '';
  4. $reply='';
  5. //создаем сокет для подключения ТСП
  6. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  7. // создаем соединение с сервером
  8. $connection = socket_connect($socket, $server, $port);
  9. if ($connection === false)      die("Cannot connect to server {$server}:{$port}");
  10. //отправляем сообщение
  11. socket_write($socket, $smes."\r\n", strlen($smes."\r\n"));
  12. //получаем ответ
  13. $reply = socket_read($socket,4096);
  14. //дальше ответ записывается в файл, что пропущу.
  15.  
  16.  

осталось теперь найти способ прослушивать все ответы от сервера. Т.к. информация поступает не переодично. Т.е. запрос на сервер ушел, ответ пришел. Потом через 2-3 минуты еще ответ от сервера. Как эти ответы отловить? Может кто поможет?
Мне бы как-нть зациклить, чтоб ответ читало, пока есть соединение. Пытался зациклить, клинит браузер. Помогите плиз!!! Растерялся Растерялся Растерялся Что такое? Что такое? Что такое? Что такое?
4. Мелкий - 17 Августа, 2011 - 19:32:54 - перейти к сообщению
Смотрите в сторону неблокирующих сокетов.
5. PATCH - 18 Августа, 2011 - 08:06:53 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $server = 'test.server';
  3. $port = 1982;
  4. $smes = '';
  5. $reply='';
  6. //создаем сокет для подключения ТСП
  7. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  8. // создаем соединение с сервером
  9. $connection = socket_connect($socket, $server, $port);
  10. if ($connection === false)      die("Cannot connect to server {$server}:{$port}");
  11. //отправляем сообщение
  12. socket_write($socket, $smes."\r\n", strlen($smes."\r\n"));
  13. //получаем ответ
  14. do{
  15. $reply = socket_read($socket,4096);
  16. if($reply == TRUE)
  17. {
  18.  // ответ записывается в файл
  19. }
  20. }
  21. while(1=1);
  22.  


примечание если вам надо отлов 24/7 то ставим set_time_limit(0); если к примеру до 10 минут то set_time_limit(600); думаю алгоритм понятен) еще 1 при set_time_limit(0); скрипт может работать без браузера)) вот тока что тестиЛ)) но что бы его остановить надо или html форму написать с кнопкой стоп и отправкой запроса на остановку цикла)) или же перезагружать apache+mysql))
6. sphinks - 18 Августа, 2011 - 20:33:45 - перейти к сообщению
Спасибо огромнейшее за помощь. Действительно, работает с бесконечным зацикливанием.
Но вот проблемка еще появилась: не могу прочитать сообщение с сервера больше чем 12КВ. Т.е. я ему говорю: socket_read($socket,131072) (128KB), а он читает первые 12 и все ((
Читал инфу по socket_read() -ничего путного не нашел (( Может кто знает как повысить лимит читабельности ? Может кто-то знает, как бороться с этим недугом?
7. PATCH - 18 Августа, 2011 - 21:24:42 - перейти к сообщению
кстати насчет постояного соединения еще как вариант http://php.su/functions/?pfsockopen

мб эта подойдет http://php.su/functions/?socket-recv я если честно с сокетами не работал) вот нашел перечень функций http://php.su/functions/?cat=sockets
8. sphinks - 22 Августа, 2011 - 14:55:24 - перейти к сообщению
Всем участникам огромное спасибо за помощь.
Все вылечил, разобрался со всем.
На счет читабельности проблема скрывалась в другом:
Сервер передавал с перебоями. А т.к. передавался хмл, то деструктор выдавал ошибку. Поборол недуг разглядывая последний символ в ответе.

 

Powered by ExBB FM 1.0 RC1