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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PHP работа с сокетами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: открытие соединения, отправка и прием сообщений, закрытие соединения
sphinks
Отправлено: 18 Июля, 2011 - 15:21:55
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Задача:
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. }

т.е. ждем ответа, пока открыто соединение.

(Отредактировано автором: 18 Июля, 2011 - 15:52:28)

 
 Top
sphinks
Отправлено: 02 Августа, 2011 - 17:55:48
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Помогите разрешить проблему:
в телнете задаю коннект - соединяется с сервером по заданному порту. При отсылке сообщения, получаю ответ.
А как это описать в ПХП?
 
 Top
sphinks
Отправлено: 17 Августа, 2011 - 18:52:40
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Хе, спасибо всем за помощь. Хорошо, пальцы, клавиатура и инет работают.
Итак, вот реализация клиента для подключения к серверу
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 минуты еще ответ от сервера. Как эти ответы отловить? Может кто поможет?
Мне бы как-нть зациклить, чтоб ответ читало, пока есть соединение. Пытался зациклить, клинит браузер. Помогите плиз!!! Растерялся Растерялся Растерялся Что такое? Что такое? Что такое? Что такое?

(Отредактировано автором: 17 Августа, 2011 - 19:08:44)

 
 Top
Мелкий Супермодератор
Отправлено: 17 Августа, 2011 - 19:32:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Смотрите в сторону неблокирующих сокетов.


-----
PostgreSQL DBA
 
 Top
PATCH
Отправлено: 18 Августа, 2011 - 08:06:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 924
Дата рег-ции: Апр. 2011  


Помог: 22 раз(а)




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))

(Отредактировано автором: 18 Августа, 2011 - 08:08:56)

 
 Top
sphinks
Отправлено: 18 Августа, 2011 - 20:33:45
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Спасибо огромнейшее за помощь. Действительно, работает с бесконечным зацикливанием.
Но вот проблемка еще появилась: не могу прочитать сообщение с сервера больше чем 12КВ. Т.е. я ему говорю: socket_read($socket,131072) (128KB), а он читает первые 12 и все ((
Читал инфу по socket_read() -ничего путного не нашел (( Может кто знает как повысить лимит читабельности ? Может кто-то знает, как бороться с этим недугом?

(Отредактировано автором: 18 Августа, 2011 - 21:19:34)

 
 Top
PATCH
Отправлено: 18 Августа, 2011 - 21:24:42
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 924
Дата рег-ции: Апр. 2011  


Помог: 22 раз(а)




кстати насчет постояного соединения еще как вариант http://php.su/functions/?pfsockopen

мб эта подойдет http://php.su/functions/?socket-recv я если честно с сокетами не работал) вот нашел перечень функций http://php.su/functions/?cat=sockets

(Отредактировано автором: 18 Августа, 2011 - 21:30:02)

 
 Top
sphinks
Отправлено: 22 Августа, 2011 - 14:55:24
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Всем участникам огромное спасибо за помощь.
Все вылечил, разобрался со всем.
На счет читабельности проблема скрывалась в другом:
Сервер передавал с перебоями. А т.к. передавался хмл, то деструктор выдавал ошибку. Поборол недуг разглядывая последний символ в ответе.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB