| | | | |
Пишем Jabber-клиент на Delphi | Полный текст материала
Другие публикации автора: Дмитрий Кузан
Цитата или краткий комментарий: «... Описание протокола Jabber с примером реализации клиента на Delphi ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 19 | 95% | | | | Ничего особенно нового и интересного | [2] | 1 | 5% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 20 | | | Все понятно, материал читается легко | [1] | 8 | 57.1% | | | | Есть неясности в изложении | [2] | 5 | 35.7% | | | | Непонятно написано, трудно читается | [3] | 1 | 7.1% | | Всего проголосовали: 14 |
[Сетевые службы и протоколы]
Отслеживать это обсуждение
Всего сообщений: 9807-10-2013 21:40А можно еще раз ссылку на D2010 + NativeXML |
|
17-01-2013 08:44
17-01-2013 03:53Добрый день. К сожалению файлы по последним ссылкам больше не доступны. Кто успел скачать, не могли бы Вы выложить еще раз этот файл?
|
|
29-09-2012 10:42
28-09-2012 01:32Добрый день!
Извиняюсь, за то что долго не отвечал, выкладываю версию для D2010 кому надо еще
http://zalil.ru/33796093
Сейчас к сожалению почти забросил клиента, поэтому сильно помочь ответами не смогу.
>> Удаление:
<iq from='pmavirus@jabber.ru/TJabberClient' type='set' id='339656037'>
<query xmlns='jabber:iq:roster'>
<item jid='artem-soft@jabber.ru' subscription='remove'/>
<group>Buddies</group>
</item></query>
</iq>
попробуйте убрать /> в итем, получается закрытие лишнее, вы же после закрываете, т.е. <item jid='artem-soft@jabber.ru' subscription='remove'>
|
|
04-09-2012 02:02Добавляю контакт пакетом:
>>><iq from='pmavirus@jabber.ru' type='set' id='c5528f75b2'><query xmlns='jabber:iq:roster'><item jid='artem-soft@jabber.ru' name='artem-soft@jabber.ru'><group>Buddies</group></item></query></iq>undefined
Ответ:
<iq from="pmavirus@jabber.ru" to="pmavirus@jabber.ru/TJabberClient" id="push572903524" type="set"><query xmlns="jabber:iq:roster"><item subscription="none" name="artem-soft@jabber.ru" jid="artem-soft@jabber.ru"><group>Buddies</group></item></query></iq>
Контакт добавляется.
Удаление:
<iq from='pmavirus@jabber.ru/TJabberClient' type='set' id='339656037'><query xmlns='jabber:iq:roster'><item jid='artem-soft@jabber.ru' subscription='remove'/><group>Buddies</group></item></query></iq>
Ответ:
<stream:error><xml-not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"></xml-not-well-formed></stream:error>
Типа ошибка. Помогите! |
|
11-02-2011 00:03Добрый день
Дмитрий не могли бы вы еще раз выложить версию для Д2010, файл не доступен.
Либо можте быть кто-то из тех кто скачал выложит. |
|
05-01-2011 03:09to Дмитрий Кузан.
Возможна ли с Вами связь по электронной почте, icq или jabber? Есть некоторые вопросы, на которые хочется получить ответы. Ваша статья очень помогла, но возникли затруднения.
Очень жду связи.
JID: artist@jabe.info
ICQ: 222212180
e-mail: temproary-a@yandex.ru |
|
10-11-2010 05:56В статье сказано, что
"realm — JID-domain пользователя"
Это не совсем верно.
Чтобы узнать, что такое realm, надо читать rfc http://tools.ietf.org/html/rfc2831 . Жаббер сервер может указать какие рилмы доступны, и тогда клиент обязан выбрать один из доступных. Как правило сервер не указывает, тогда клиент имеет право выбрать любой понраившийся ему realm. Например QIP испольузет пустую строку. Pidjin подставляет имя сервера (из настроек или из SRV записи). Miranda, вероятно, ведёт себя также как QIP.
Домен, для которого происходит авторизация, указывается ещё в самой первой станзе. А вот realm в общем своём виде не имеет ни какого отношения к домену. |
|
13-08-2010 08:07сообщение от автора материала О, мой мозг!!! А какому числу соответствует строчка "0.1.2.3.4.5"?
Можете переделать, будете смеятся но такое тоже возможно, функция просто была выдернута из модуля работы с MapInfo где могут попадатся такие числа в записи координат например 61.12.54 типа 61 град 12 мин 54 сек |
|
30-07-2010 07:51 Function IsInt(Str : String): Boolean;
var
Pos : Integer;
begin
Result := True;
Str := Trim(Str);
For Pos := 1 To Length(Str) do
begin
IF (Str[Pos] <> '0') and (Str[Pos] <> '1') and
(Str[Pos] <> '2') and (Str[Pos] <> '3') and
(Str[Pos] <> '4') and (Str[Pos] <> '5') and
(Str[Pos] <> '6') and (Str[Pos] <> '7') and
(Str[Pos] <> '8') and (Str[Pos] <> '9') and
(Str[Pos] <> '.') Then
Begin
Result := False;
Exit;
end;
end;
end;
О, мой мозг!!! А какому числу соответствует строчка "0.1.2.3.4.5"? |
|
28-07-2010 23:37
23-07-2010 19:48Присоединюсь к двум авторам нижу, если можно новую ссылочку компонент. |
|
20-07-2010 04:48Может у кого-то есть исходники, которые выкладывал автор 15-03-2010 (для D2010)? Пожалуйста, выложите на файлообменник. |
|
23-05-2010 10:17Дмитрий, не могли бы вы повторно выложить версию для D2010?
А то ссылки уже нерабочие...
Спасибо! |
|
16-03-2010 23:58сообщение от автора материала >> Дмитрий, под d2007 новый компонент работает с заменой pwidechar на pchar, однако коннект к jabber.org до сих пор не проходит. не посмотрели еще на этот счет?
Простая замена pwidechar на pchar на D2007 действительно заставляет новый компонент работать, но помимо этого требуются еще доработки связанные с UTF8 декодированием и преобразованием. Т.к. в D2010 некоторые преобразования решались на уровне самого компилятора, то в D2007 придется делать вручную кое-где. Например после простой замены типов не работают статусы (показываются пустые) и показывается неполный JID т.к. русский ресурс теряется (пустой). Но это мелочи легко исправляются. Дело в том, что сейчас под D2007 все таки лучше использовать старый компонент. Портировать новый под D2010 обратно в старый смысла нет. Фактически новый пока идет параллельно старому и я еще пока не решил буду ли портировать свои проекты в D2010 или оставлю пока на старом компоненте. |
|
16-03-2010 06:41
16-03-2010 00:57сообщение от автора материала >> А Delphi нужна чистая или с какими-нибудь компонентами?? Если нужны, то какие? Спасибо.
NativeXML для последнего компонента только
К сожалению для D7 нет возможности проверить, но уже
_MyFunctions.Strings.pas(399): Operator not applicable to this operand type
for Find in ArrSymbols do
begin
if pos(Find, Str) <> 0 then
Str := ReplaceSub(Str, Find, ChRepl);
end;
в D7 не было инструкции for in - достаточно заменить на for to переписав блок и заработает
|
|
16-03-2010 00:44сообщение от автора материала Дмитрий, под d2007 новый компонент работает с заменой pwidechar на pchar, однако коннект к jabber.org до сих пор не проходит. не посмотрели еще на этот счет?
pwidechar - в OutputDebugString D2010 приходится приводить, в D2007 и ниже там тип действительно PChar
Насчет Jabber.org - я тут попытался qip ом зарегить JID на нем. На что получил ошибку "Соединение потеряно". Поиск в инете дал что с Jabber.org имеются проблемы у многих клиентов.
"Вот уже месяц на старейшем IM сервере XMPP, jabber.org, идет эпопея с переходом на новое программное обеспечение. Большинство наблюдателей уже согласились с тем, что новый поставщик: Isode, конкретно облажался со своим сервером M-Link, но администрация jabber.org упорно продолжает следовать своему выбору. Позади осталась куча проблем с утечками памяти, повреждением профилей пользователей при миграции и т.д. Куда печальнее тот факт, что после перехода с этим сервером перестала работать половина распространенных Jabber клиентов.
Подробнее
http://www.jabber.org/2010/02/service-update-2010-02-16/"
Так как сейчас возможности зарегистрироватся на Jabber.org нет то увы проверить работу компонента не представляется возможным. Скорее все еще будет введено шифрование SSL принудительно, а клиент увы не поддерживает SSL. ТАк что пока даже и не знаю что сказать |
|
15-03-2010 15:32А Delphi нужна чистая или с какими-нибудь компонентами?? Если нужны, то какие? Спасибо. |
|
15-03-2010 11:24Дмитрий, под d2007 новый компонент работает с заменой pwidechar на pchar, однако коннект к jabber.org до сих пор не проходит. не посмотрели еще на этот счет? |
|
15-03-2010 06:42Уважаемый Дмитрий! При попытке скомпилировать последний проект на Delphi 7, появляются те же ошибки , что и были. Я так понимаю, его тока можно запустить на D2010? |
|
15-03-2010 02:34
15-03-2010 02:34сообщение от автора материала Перевел компонент на D2010, заменил также XML парсер на NativeXML, т.к. старый не работает в D2010
теоретически должно работать и в D2007
новая версия тут http://zalil.ru/upload/28796058
для D2010 сделан Jabber_D2010.dpk для упрощения установки в среду
|
|
12-03-2010 05:52Вообщем так, скачал последний проект(http://slil.ru/28740559). Там три папки, скачал все файлы в папку Demo. Затем запускаю _Test.dpr. Нажимаю Run и выдает ошибки:
[Error] _MyFunctions.Strings.pas(399): Operator not applicable to this operand type
[Error] _MyFunctions.Strings.pas(400): Expression expected but 'BEGIN' found
[Fatal Error] JabberClient.pas(26): Could not compile used unit '_MyFunctions.Strings.pas'
При попытки игнорировать эти ошибки появляются новые. Если все время игнорировать, проект все же скомпилировался, но при попытке подключится к серверу, выдает сообщение "Ошибка:Невозможно создать сокет".
Скорей всего это я что-то не так делаю!)
Заранее спасибо за помощь!! Буду Очень благодарен, если поможете решить эту проблему! |
|
08-03-2010 08:24сообщение от автора материала >> Народ, а в какой Delphi лучше скомпилировать? А то у меня никак не выходит! Пользуюсь Delphi 7(( Все время какие-то ошибки. Может я че-нить не так делаю
Буду очень благодарен!
Изначально делал в D2007,
Насчет ошибок можно поподробнее |
|
08-03-2010 08:23сообщение от автора материала >> Caesar
Проверю насчет Jabber.org |
|
04-03-2010 13:32Народ, а в какой Delphi лучше скомпилировать? А то у меня никак не выходит! Пользуюсь Delphi 7(( Все время какие-то ошибки. Может я че-нить не так делаю
Буду очень благодарен!
|
|
04-03-2010 09:12спасибо, заметил, к серверу jabber.org компонент больше не полдключается. обмен пакетами прекращается после следующего
Отправлен пакет: размер: 86 байт(а)
<iq type='set' id='bind_2'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
Принят пакет: размер: 49 байт(а)
<iq from="jabber.org" type="result" id="bind_2"/> |
|
03-03-2010 23:18
03-03-2010 03:31Дописал в компонент поддержку CRAM-MD5 и PLAIN авторизации, помимо DIGEST-MD5
т.к. некоторые Jabber -сервера не поддерживают DIGEST-MD5
если интересно могу выложить
конечно, Дмитрий, будем рады взглянуть |
|
26-02-2010 03:35при попытке скомпилить выдает кучу ошибок, причем большинство в Myfunction.string(( Система стоит Windows 7 64x.
Скиньте мне плиз на мыло проект , который нормально компилится. Заранее спасибо! Titoha88@mail.ru |
|
30-01-2010 01:01
26-01-2010 01:42сообщение от автора материала >>Компонент не работает нормально с уникодом тестировал на windows server
Посмотрю что может быть, а WinServer какой ? |
|
22-01-2010 22:41>> Компонент не работает нормально с уникодом тестировал на windows server?
Да кстати с кириллицей у него проблемы. Тоже на сервер хотел поставить, отображает краказяблы. Пришлось на Windows XP ставить. |
|
25-12-2009 00:36Прочитав материал я понял, что jabber ни когда не станет популярным среди программистов и как всетаки гениально просто устроен irc, в сравнении с этим монстром )) |
|
21-12-2009 00:32сообщение от автора материала >> Компонент не работает нормально с уникодом тестировал на windows server?
Не работает как? Можно поподробнее? |
|
19-12-2009 12:38 if FProxyResolve then
SendStr('CONNECT ' + FDestHost + ':' + IntToStr(FDestPort) + ' HTTP/1.0' + #13#10)
else
SendStr('CONNECT ' + WSockAddrToIp(FDestIp) + ':' + IntToStr(FDestPort) + ' HTTP/1.0' + #13#10);
SendStr('User-Agent: Mozilla/4.08 [en] (WinNT; U ;Nav)' + #13#10);
if FProxyAuth then
SendStr('Authorization: Basic ' + EncodeBase64(ProxyUser + ':' + ProxyPass) + #13#10 +
'Proxy-Authorization: Basic ' + EncodeBase64(ProxyUser + ':' + ProxyPass) + #13#10);
SendStr(#13#10);
Здесь лучше переделать чтоб пакет одной командой отсылался, а то некоторые прокси сразу дисконнект делают.
Компонент не работает нормально с уникодом тестировал на windows server |
|
08-12-2009 10:46
08-12-2009 07:33
08-12-2009 07:08
08-12-2009 06:47сообщение от автора материала Дописал в компонент поддержку CRAM-MD5 и PLAIN авторизации, помимо DIGEST-MD5
т.к. некоторые Jabber -сервера не поддерживают DIGEST-MD5
если интересно могу выложить
|
|
01-12-2009 04:45сообщение от автора материала Огромное спасибо Yuri-ю Serebrennikov-у за представленную идею обрабатывать входящии пакеты используя предварительный парсер, переделал немного компонент на его идее, стало логичнее и смотрибельней что ли.
Выложил обновление тут.
http://slil.ru/28278366 |
|
16-11-2009 11:30Странность какая то с этим sourceforge или чегото я не допонимаю, положиш файл на раздачу вроде лежит а через некоторе время исчезает. Исходники также можно скачать из репозитория SVN клиентом.
|
|
16-11-2009 04:00
15-11-2009 19:55
09-11-2009 23:21сообщение от автора материала >> В чем по мнению автора может быть причина слета на jabberd2?
Даже и не знаю, нужно смотреть какой идет обмен XML пакетами, вполне возможно что что-то необрабатывается корректно.
>> Почему бы не обновить исходники примера, чтобы не кувыркаться желающим потестить его
Да обновление будет, но чуть позже, исправляю мелкие огрехи пока. |
|
02-11-2009 06:48Доброго времени суток!
Довольно содержательная статья. С некоторыми "приседаниями" даже удалось скомпилировать тестовый клиент. (Почему бы не обновить исходники примера, чтобы не кувыркаться желающим потестить его).
С некоторыми jabber-серверами пример отрабатывает. Пробовал jabber.org, qip.ru.
А вот со своим jabberd2 сервером - никак.
Где-то вылетает ошибка парсера типа: хочу < , но не нахожу и после этого конект завершается.
"Промышленные" клиенты (qip, psi, bombus и другие) с этим сервером нормально работают.
В планах есть желание сделать собственный клиент и статья очень даже хорошее подспорье, хотя моя обычная среда CBuilder.
В чем по мнению автора может быть причина слета на jabberd2?
Недостатки парсера, или отклонения от реализации стандарта XMPP в примере, ну или ...? |
|
23-10-2009 07:57сообщение от автора материала >> Oleg Denisenko
Спасибо, с удовольствием посмотрю Ваше решение. |
|
23-10-2009 07:56сообщение от автора материала >> IMadering
Попробуйте String переименовать к типу AnsiString |
|
15-10-2009 14:32Возможно я не туда пишу... Но с другой стороны может быть кому-то я хоть чем нибудь помогу.
В общем так. В связи с тем, что я потерял интерес (точнее нет времени) к одному своему проекту - хочу выложить исходные тексты простого Delphi Jabber Bota (djBot)
забрать исходные тексты можно здесь
http://support.lime-systems.com/~tender/board/other/djbot_src.zip
Вопросы задавать, если они будут, конечно можно... Но вот найду ли я время ответить на них - вопрос...
живого в работе бота можно посмотреть, например, здесь leprosorium@conference.jabber.ru
|
|
10-10-2009 08:18Здравствуйте! Дмитрий Кузан ваша статья мне очень помогла написать свой жаббер клиент. Но вот у меня появилась проблемка, которую я не могу решить и прошу помощи у вас и уважаемых пользователей королевства. После того как я перевёл свой проект на delphi 2010 всё работает нормально, но авторизоваться могу только по механизму PLAIN. А вот механизм DigestMD5 пускать не хочет говорит неверный пароль. Так как делфи 2010 аппелирует строками и символами в юникоде я понимаю, что перестала нормально работать функция из вашего примера function GenResponse(UserName, realm, digest_uri, Pass, nonce, cnonce: string): string; Все мои попытки как то снова заставить её работать пока успехом не увенчались. Поэтому прошу помощи у вас! Может кто-то поделиться рабочей функцией авторизации по DigestMD5 в делфи 2009 - 2010 адаптированной под юникод. Заранее благодарен! |
|
24-08-2009 09:26сообщение от автора материала Сервер всегда шлет валидный XML, и от Вас он требует того же. Иначе закрывает поток с ошибкой. Все дело, вероятнее всего, в недостаточности знаний ;)
Просто XMPP это не совсем обычный XML, это открытый XML-поток. Т.е. то, что <stream:stream/> не закрыт это фича - он открыт и новые сообщения приходят постепенно. Поэтому и дополнительной проверки на целостность XML при приеме сообщений в общем-то не нужно. Единственное, что нужно сделать, это сделать спец.обработку двух тегов - <?xml ... ?> и <stream:stream>, и изменить алгоритм на:
1. дописываем к буферу (изначально он пустой) содержимое, полученное из сети
2. пытаемся распарсить содержимое в буфере. Тут такой момент, что нужно распарсить все завершенные теги (т.е. из "<x1 attr1="a1">data1</x1><x2/><x3>partial-data" мы должны распарсить теги <x1/> и <x2/>.
3. анализ полученного XML, удаление из буфера того XML, который мы уже обработали
4. и опять на шаг #1
Т.е. читать содержимое потока целыми, законченными фразами.
А так, ждем продолжения про чаты ;) Успехов
Я думал про это если честно. Однако уже долгое время пользуюсь таким вариантом, и заметил, что практически порционные части XML приходят очень редко, если честно то я знаю только один гарантированный случай приходата такого пакета, это когда приходит длинное сообщение по частям. Поэтому я сделал так. Насчет буфера идея то здравая, но требует координального переписывания XML парсера а лучше создание оного с нуля, для работы с такими блоками (что бы не ругался на валидацию XML, текущий ругается), что пока увы не осуществимо да и не востребовано по причине редкости таких пакетов (может я и не прав но за долгое время я не замечал чтоб разрыв XML был сделан так, что начало ноды в первом пакете идет а конец в другом, за исключением передачи длинного текста опять же. Поэтому для примера пойдет, ну а для серьезных вещей конечно еще требует переработки.
А по поводу чатов, работа идет но не так как увы хотелось бы, так как дела рабочии и личные затягивают время написания данной статьи. Но она в планах есть. |
|
24-08-2009 05:02Sega-Zero>поставьте в таком случае еще защиту от подобных пакетов
нужна скорее не защита, а правильная обработка ;)
Дмитрий Кузан>некоторые в частности jabber.ru сервера шлют неверные XML пакеты
Сервер всегда шлет валидный XML, и от Вас он требует того же. Иначе закрывает поток с ошибкой. Все дело, вероятнее всего, в недостаточности знаний ;)
Просто XMPP это не совсем обычный XML, это открытый XML-поток. Т.е. то, что <stream:stream/> не закрыт это фича - он открыт и новые сообщения приходят постепенно. Поэтому и дополнительной проверки на целостность XML при приеме сообщений в общем-то не нужно. Единственное, что нужно сделать, это сделать спец.обработку двух тегов - <?xml ... ?> и <stream:stream>, и изменить алгоритм на:
1. дописываем к буферу (изначально он пустой) содержимое, полученное из сети
2. пытаемся распарсить содержимое в буфере. Тут такой момент, что нужно распарсить все завершенные теги (т.е. из "<x1 attr1="a1">data1</x1><x2/><x3>partial-data" мы должны распарсить теги <x1/> и <x2/>.
3. анализ полученного XML, удаление из буфера того XML, который мы уже обработали
4. и опять на шаг #1
Т.е. читать содержимое потока целыми, законченными фразами.
А так, ждем продолжения про чаты ;) Успехов |
|
17-08-2009 09:26Как использовать прокси в вашем компоненте? Перепробовал все ничего не выходит |
|
03-08-2009 03:15сообщение от автора материала >> как использовать синтаксис xhtml внутри сообщения?
можно поподробнее, а то как то расплывчито и не понятно, что конкретно вы хотите узнать? |
|
01-08-2009 22:48как использовать синтаксис xhtml внутри сообщения? |
|
27-07-2009 04:55сообщение от автора материала KDSocket попробуйте убрать, его уже давно нет, скорее все просто ссылка осталась |
|
26-07-2009 23:30При компиляции требует KDSocket.pas, которого в архиве нету. Поделитесь файлом, пожалуйста)) |
|
18-07-2009 11:30Нашел опечатку. В тексте:
Элемент <Subject> определяет тему сообщения. На него действуют те-же правила, что и для <Body>. Множественные экземпляры <Body> могут быть включены для расширения и дополнения смежных тем, но при условии, что каждый экземпляр обладает атрибутом 'xml:lang' с отличным языковым значением.
Наверное, следует читать:
Множественные экземпляры <Subject> могут... |
|
08-07-2009 07:04скачал компонент, установил, при попытке законнектиться в процедуре
procedure TCustomSocket.Connect;
при вызове FSocket := WinSock.Socket(PF_INET, SOCK_STREAM, 0)
получаю результат "-1" и ошибку "невозможно создать сокет". что не так? |
|
24-06-2009 17:26Дмитрий, огромное спасибо, благим делом занимаетесь ;) |
|
21-06-2009 23:45сообщение от автора материала Немного доработал компонет.
+ Обработчик OnJabberSentErrorMessage вызывается если по каким либо причинам сообщение не было доставлено адресату и вернулось с ошибкой
+ немного оптимизации и исправления мелких огрех
+ класс переделан в компонент для установки в IDE
Выложил:
http://slil.ru/27778214
|
|
06-06-2009 15:28Не могли бы вы выложить в любом удобном вам месте доработанные исходники. Спасибо |
|
14-05-2009 00:27сообщение от автора материала >> Sega-Zero
Спасибо за информацию - проверю.
|
|
14-05-2009 00:22сообщение от автора материала <x:y/>
Хм, вроде по стандарту XML допускается такое закрытие тега, т.е это эквивалентно записи <x:y></x:y>, по крайней мере парсер проглатывает такие ноды
другое дело вот пример пакета с незакрытым тегом stream:stream
<?xml version='1.0' encoding='UTF-8'?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="komicsm.ru" id="4e672364" xml:lang="en" version="1.0">
<stream:features>
<compression xmlns="http://jabber.org/features/compress">
<method>zlib</method>
</compression>
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>
причем это на jabber.ru, пришлось проверять и автозакрывать так
<?xml version='1.0' encoding='UTF-8'?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="komicsm.ru" id="4e672364" xml:lang="en" version="1.0"/>
<stream:features>
<compression xmlns="http://jabber.org/features/compress">
<method>zlib</method>
</compression>
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>
|
|
13-05-2009 08:46поставьте в таком случае еще защиту от подобных пакетов
<message to='%s' type='%s'><x:y/></message>
Одно время такие станзы жестко клинили миранду и инфиум. еще бывает не только незакрытый тег прийдет вот так <x/>, но и парные теги не всегда (<x></x>)
а для тестов рекоммендую сервер jabbim.cz - там полно новых вещей |
|
13-05-2009 02:57сообщение от автора материала Вот немного переработал механил подключения, вкратце история такова, старая версия подключалась не ввсегда сразу
из-за склеенных пакетов иногда парсер не отрабатывал, исправил оный люк и сразу нарвался на новый, а именно что
некоторые в частности jabber.ru сервера шлют неверные XML пакеты, например без закрытых тегов, на которых парсер
просто клинит. Пришлось еще и это отслеживать, зато подключатся стал лучше и стабильнее.
Кому интересно выложу
|
|
05-05-2009 00:17сообщение от автора материала Как и обещал правка по поводу пустых сообщений
procedure TKDJabberClient.toMessage(Node : TjanXMLNode2);
var
Types, From : WideString;
BodyNode : TjanXMLNode2;
Body : UTF8String;
BodyE : string;
I : Integer;
begin
{Стандартно так
<message type="chat" to="кому" id="ид клиента" from="от кого">
<body>Сообщение</body>
</message>
может быть и так с транспорта
<message from='*********@pyicq.aftar.ru'
to='****@jabber.ru' id='15358' type='chat'>
<x xmlns='jabber:x:event'>
<composing/>
</x><active xmlns='http://jabber.org/protocol/chatstates'/>
<body>привет</body>
</message>.
}
Types := VarToStr( Node.attribute[cType] );
From := UTF8Decode( Node.attribute[cFrom] );
Body := '';
for I := 0 to Node.childCount - 1 do
begin
BodyNode := Node.childNode[I];
if AnsiCompareStr(BodyNode.name, nodeBody) = 0 then
begin
Body := BodyNode.text;
Break;
end;
end;
if Trim(Body) <> '' then
begin
BodyE := UTF8Decode(Body);
BodyE := StringReplace(BodyE,'<' ,'<',[rfIgnoreCase]);
BodyE := StringReplace(BodyE,'>' ,'>',[rfIgnoreCase]);
BodyE := StringReplace(BodyE,'&' ,'&',[rfIgnoreCase]);
BodyE := StringReplace(BodyE,'"','"',[rfIgnoreCase]);
Body := UTF8Encode(BodyE);
end;
// Сообщение может разбиватся поэтому перед обработчиком идет проверка на целостность XML
// если XML полный то посылаем сразу а нет так дожидаемся друних пакетов для
// обработки
if Pos('/message>', PacketStr) = 0 then
begin
isMessageDiv := True; // Говорим что сообщение разрывное
BufPacketStr := PacketStr;
end
else
begin
isMessageDiv := False; // Говорим что сообщение НЕ разрывное
IF Assigned(FOnJabberSentMessage) then
if Trim(Body) <> '' then
FOnJabberSentMessage(Self, Types, From, Body);
end;
end;
|
|
25-04-2009 06:52сообщение от автора материала >>IPWorks поддерживает общение в чате, не подскажете? :)
Нет. |
|
24-04-2009 22:31IPWorks поддерживает общение в чате, не подскажете? :) |
|
22-04-2009 12:22Если бы только DLL таскать, так еще и цена в 470 у.е. )) |
|
08-04-2009 04:34
02-04-2009 02:16сообщение от автора материала >>
Всем спасибо за ответы, очень помогли, но вот заметил еще одну вещь, сообщения пришедшие от контактов с транспортов не отображаются. Я так понял неправильно происходит парсинг.
Данные которые приходят в этих случаях различаются. Например обычное сообщение:
<message from='******@jabber.ru/QIP'
to='****@jabber.ru'
xml:lang='ru' type='chat' id='qip_17'>
<body>привет</body>
</message>
а сообщение от контакта с транспорта:
<message from='*********@pyicq.aftar.ru'
to='****@jabber.ru' id='15358' type='chat'>
<x xmlns='jabber:x:event'>
<composing/>
</x><active xmlns='http://jabber.org/protocol/chatstates'/>
<body>привет</body>
</message>.
как это можно исправить?
В процедуре TKDJabberClient.toMessage в файле JabberClient.pas дописать проверку на такие сообщения
Сам я транспорты не использовал, проверю внесу изменения в код.
|
|
31-03-2009 12:56
31-03-2009 08:34Всем спасибо за ответы, очень помогли, но вот заметил еще одну вещь, сообщения пришедшие от контактов с транспортов не отображаются. Я так понял неправильно происходит парсинг.
Данные которые приходят в этих случаях различаются. Например обычное сообщение:
<message from='******@jabber.ru/QIP' to='****@jabber.ru' xml:lang='ru' type='chat' id='qip_17'><body>привет</body></message>
а сообщение от контакта с транспорта:
<message from='*********@pyicq.aftar.ru' to='****@jabber.ru' id='15358' type='chat'><x xmlns='jabber:x:event'><composing/></x><active xmlns='http://jabber.org/protocol/chatstates'/><body>привет</body></message>.
как это можно исправить? |
|
31-03-2009 07:52Можно просто убрать галочку Stop on Delphi exceptions из настроек отладчика. |
|
31-03-2009 01:57>>> запускать не из под компилятора <...>
Долго думал над этой фразой ;-)
Компилятор -- это программа, которая преобразует текст на языке программирования в бинарный код исполняемого модуля (EXE, DLL и т.п.).
Если Вы запускаете программу из среды (IDE) Delphi (например, нажав кнопочку F9), то при этом эта самая среда по умолчанию показывает Вам все происходящие исключения (если в настройках это не изменено). Подразумевается, что программу из среды запускают для отладки. Конечный пользователь запускает готовый EXE-файл безо всякой IDE Delphi. И тогда никакие исключения выскакивать не будут (ну, кроме тех, что прошляпил программист при разработке ;-)). |
|
30-03-2009 12:15То есть это как бы "норма". запускать не из под компилятора и использовать? |
|
30-03-2009 11:43сообщение от автора материала >> После запуска скомпилированной программы подключается нормально, а после нажатия "Logging" вылезают 2 раза exception "Expected < when parsing text". но если дальше продолжить исполнение кода всё работает нормально. как это исправить?
Никак, это исключения XML Parserа, возникает из-за того что на вход попадает неправильных XML. Исключение возникает при отладке и работе в среде. В скомпилированном приложении оно закрыто try-except |
|
30-03-2009 11:37После запуска скомпилированной программы подключается нормально, а после нажатия "Logging" вылезают 2 раза exception "Expected < when parsing text". но если дальше продолжить исполнение кода всё работает нормально. как это исправить? |
|
15-03-2009 01:52Скиньте пожалуйста готовый к компиляции проект на мыло rus_999@mail.ru. |
|
02-03-2009 00:54сообщение от автора материала >>> Могу отдать с полными исходниками на растерзание своего Delphi Jabber бота.
Ядро - Delphi, исполнительный код обработки команд - VBScript/JScript.
Надоело, да и посмотрев исходники опубликованные тут понял, что лучше все переписать.
Уважаемы Oleg.
А можно узнать что вам так надоело. Что вас не устраивает в этом примере. Я понимаю что для нормального рабочего он далек. Так-же не все в нем реализовано так как нужно. Но он работает и для примера вполне годен. Хотелось бы услышать здравую критику, а не высказывания что лучше переписать все с нуля.
Да и ваши исходники выложите если уж обещаете. Я думаю и я и многие с удовольствием их посмотрим. Да и взгляд со стороны не помешает.
С уважением. |
|
02-03-2009 00:31выходит в моей системе нет поддержки второй версии винсокетов
Странно, потому что последняя версия Windows, в которой не было по умолчанию WinSock 2 - это 95-я. |
|
01-03-2009 15:13спасибо, Олег, выходит в моей системе нет поддержки второй версии винсокетов... |
|
01-03-2009 12:37добавить в KDSocket.Custom.pas
var
WSAData: TWSAData;
WSAStarted: Boolean;
initialization
if WSAStartup(MAKEWORD(1, 1), WSAData) <> 0 then begin
MessageBox(0, PChar('Could not start WSA'), 'Error!', MB_ICONERROR);
WSAStarted := False;
end else
WSAStarted := True;
finalization
if WSACleanUp <> 0 then begin
MessageBox(0, PChar('Could not cleanup WSA'), 'Error!', MB_ICONERROR);
end;
WSAStarted := False;
end.
|
|
01-03-2009 03:55Уважаемый Дмитрий, благодарю за прекрасную статью! У меня вопрос по примеру к статье - компилится все удачно, но при попытке подключения не удается создать сокет. Как я не пытался отловить проблему, все тщетно, WinSock.Socket(PF_INET, SOCK_STREAM, 0); выдает ошибку. причем готовый ехе в комплекте с примером подключается на ура. Буду благодарен, если наведете на решение проблемы! |
|
28-02-2009 12:58Могу отдать с полными исходниками на растерзание своего Delphi Jabber бота.
Ядро - Delphi, исполнительный код обработки команд - VBScript/JScript.
Надоело, да и посмотрев исходники опубликованные тут понял, что лучше все переписать.
Сам бот живет тут leprosorium@conference.jabber.ru
|
|
28-02-2009 08:57сообщение от автора материала >> Нескромный вопрос: а будет ли продолжение? За бортом остался лакомый кусок возможностей джаббера: общение в конференциях (чатах)...
Да планируется. Пока сейчас разбираюсь с XEP-0045 Multi User Chat. Думаю по итогам будет продолжение. |
|
27-02-2009 21:34Спасибо :)
Много нового для изучения. Информация не заменит русскоязычное описание протокола, но неплохое представление о нём конечно же даёт!
Нескромный вопрос: а будет ли продолжение? За бортом остался лакомый кусок возможностей джаббера: общение в конференциях (чатах)... |
|
21-02-2009 03:13Очень пригодилось. Спасибо! |
|
17-02-2009 07:22
17-02-2009 04:00Спасибо за полезную информацию. |
|
17-02-2009 03:37
17-02-2009 03:27
17-02-2009 03:12Писал для Mail.ru Agent клента, было забавно, одно время &ML жил.
Вот недавно было желание для pda делать jabber клиент, но все остановилось
когда стал искать русское описание протокола :о) |
|
17-02-2009 01:56Jabber захватывает умы:) Спасибо за статью |
|
17-02-2009 01:26Дмитрий, спасибо за статью. Попытался скомпилировать пример, получил ошибки, наверное Вы используете какие-то дополнительные компоненты?
Не найден файл ExceptionLog (первый файл в uses проекта),
в модуле _main - файл ExtendedDialogs,
в модуле JabberClient.Tools - IcsMD5 (наверное Вы используете компоненты ICS). |
|
|
|