![]() |
Jabber бот на php - проблема с сокетами
Всем привет!
Решил написать своего джаббер бота на пхп. Не нада кричать что есть готовые бибоиотеки с xmpp итд, я пишу с нуля. Проблема заключается втом, что функция socket_read читает только один пакет, их бывает приходит 2 или 3, приходится ее писать несколько раз, из-за этого (я так думаю, но не факт что это из-за функции) у меня сбивается порядок огбмена пакеами и соединение рвется что-ли... посылаю данные а ответа не вижу (еслиб я допустил ошибку в формировании данных, пришел бы пакет, говорящий об ошибке в синтаксисе) .. Помогите плз. PHP код:
|
На многих форумах по пхп мне не помогли. Не знают как сделать...
Вя надежда на вас! |
попробуй так:
1. $t = блаблабалбала и в конце всегда ."\n"; 2. Явно указать длину того, чего пишешь: socket_write($socket, $t, strlen($t)); 3. Читать можно попробовать так: socket_read($socket, 5000, PHP_NORMAL_READ); А вообще читай: http://ru.php.net/socket_read там есть примеры работы с сокетами, правильные примеры |
Warning: socket_read() [function.socket-read]: unable to read from socket [104]: Connection reset by peer in ....
Сделал как сказал Pashkela но вот такая штука вылезла..... |
ты под каким Php этот код писал. У меня ошибку пишет, что функции socket_create не существует.
И я не пойму, что означают строки вида: <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5' /> |
Плд нормальным! ВОт под каким ты запускаещь скриепт я непойму
|
Цитата:
|
Krist_ALL Примерный план подключение к джаббер серверу:
1) Создаем сокет (socket_create) 2) Подключаемся к серверу(socket_connect) 3) Посылаем инициализирующий запрос (<?xml version='1.0'?><stream:stream to=' и т.д.) 4) А вот дальше нужен цикл обработки и собственно ответов. Приблизительного вида: PHP код:
З.Ы. Ох и намучаешься ты с DIGEST-MD5 )) Pashkela Не вводите людей в заблуждение, если вы не разбираетесь. XMPP не предусматривает символ перевода строк, чтобы можно было читать NORMAL_READ и для socket_write НЕ требуется указывать длину буфера, если конечно не хочется передавать обрезанные данные |
Gifts, сделал я как ты написал, но чет скрипт зависв браузере - полаеися бесконечный цикл же вайл
PHP код:
|
Krist_ALL Естественно "завис". Клиент принял пакет и в бесконечном цикле ждет, когда придет следующий, а в браузер ничего не выводится из-за буферизации вывода.
Сделай так: PHP код:
|
Ну вот опять тажа проблема, что и вначале - немогу послать второй пакет, тоестья его ослал но ответа не вижу
PHP код:
Цитата:
|
/* Allow the script to hang around waiting for connections. */
set_time_limit(0); /* Turn on implicit output flushing so we see what we're getting * as it comes in. */ ob_implicit_flush(); |
ПРичем тут ob_implicit_flush();...
В холостую идет чтение опять...... |
Krist_ALL Господи, что Вы делаете. Цикл обработки будет один! не надо его копипастить сто тыщ раз. Я специально комментарий оставил где должна быть обработка. Объясняю, на том месте должно быть что-то вроде:
PHP код:
PHP код:
|
PHP код:
if (!empty($input)) { тогда выводим ответ } |
Pashkela Он будет всегда не empty, если соединение есть (связано с обработкой socket_select). Скорее надо проверять обратное:
PHP код:
|
не всегда, как видно, я потестил у себя, ответов иногда разное кол-во, в зависимости от того, какое соединение, банально F5 несколько раз и сразу видно результат
|
В общем, должно выглядеть почти так.
PHP код:
|
спаСИБО ОГРОМНОЕЙ !
|
спаСИБО ОГРОМНОЕЙ !но на этом я не закончу-завтра продолжу. Всем спасибо!
|
Итак продолжим!
После отпраки серверу пакета, который содержит метод авторизации (дигест мд5), мне приходит ответ в басе64, раскодировываю и получаю значение nonce. Я теперь должен отправить пакет который будет содержать: username='jid', realm = 'jabber.ru', nonce=123123123132', cnonce='????????', nc=0000001, qop=auth, digest-uri='xmpp/jabber.ru', charset=utf-8,response=!!!!!!!!! Итак, что жея хотел спросить. nonce Эт понятно, оно у нас уже есть,а вот что писать в поле cnonce? В документации сказано что этоуникальный код ответной клинтской сессии, сгенерированный клиентом.... Как понимать не знаю. Про response молчу. И еще, мне кажется вайл тут неочень.. может фор? Потомут что я хочу сделать отдельно авторизацию и отделюно прослушку ответов... А вообше мне кажется моя идея очень замечательная т.к. бот будет на пхп а не на питоне, то даст возможность запускать его на хостингах а не на серваках. Потому что иметь сервак и знать как с ним управится не каждый может, а вот оплатить хостинг и залить на него бота - почти каждый) |
Krist_ALL Читайте RFC2831. Например тут: http://www.faqs.org/rfcs/rfc2831.html
И собственно rfc3920bis. Все вопросы отпадут сами собой cnonce - это любая строка, например можно использовать MD5 от текущего времени. А response - функция от всех этих параметров З.Ы, если вы думаете, что PHP класс для джаббера никто до этого не придумал - вы ошибаетесь (например XMPPHP, jabberPHP) З.Ы.Ы, Зачем выдумывать лисапед (это к вашей фразе о циклах)? Вы как раз вернетесь к тому же, с чего начали - почему вам не приходят все ответы |
Я знаю про php класс. Я об этом писал в начале темы.
Я пишу простой код - простой всмысле понятный. и признаться не знаю классы и хочу написть не исползуя классы. Пасибо за ссылку на ртфм. |
Хотелось бы попдробнее чтоб кто-нибудь прокоментировал данный кусок кода
PHP код:
Почему через 5 пакетов а не 10? Ведь if ($i++ > 10) |
Krist_ALL Я просто не правил комментарий, да, там 10 пакетов будет. Этот бряк по сути нужен, только для отладки приложения. Потому что еще нет условий, по которому надо выходить из цикла. Когда скрипт дорастет до того, что будет проверять большую часть исключений (ака соединение разорвано, пришел пакет '</stream:stream>' и прочие), тогда от этой строки можно будет избавиться.
|
Если не бреак то тада цикл будет бесконечным и зависнет)
Как же хочется фор для авторизации а потом вайл для приема сообщений. |
Krist_ALL Еще раз вопрос - зачем? У тебя получится два АБСОЛЮТНО одинаковых цикла, просто в одном будешь обрабатывать одно, во втором - другое.
Цитата:
|
| Время: 00:54 |