← All posts tagged XMPP

ma1uta

часть третья, заключительно-поучительная. В заключение к juick.com и juick.com А итог простой, методом пристального взгляда заметил, что для исходящего соединения в dialback-е перепутал from и to, поэтому исходящее соединение было к самому себе вместо удаленного сервера (отсюда и второе соединение от сервера), дальше происходил handshake с самим собой и сам себе отсылал <db:verify/>, на котором радостно падал. В остатке имеем порефакторный код, попутное исправление нескольких мелких ошибок, более-менее нормальное логирование и осознание собственной никчемности...

ma1uta

В продолжение к juick.com Взял ejabberd вместо openfire, ничего не изменилось. В итоге у ежа два открытых исходящих соединения и одно входящее на другой хост. Картина такая же: ёж отправляет <db:result from="ej_server" to="myapp">secret</db:result>, приложение в ответ отправляет <db:verify xmlns:db="jabber:server:dialback" from="myapp" to="ej_server" id="someid">secret</db:verify>, и затем ёж возвращает эту же станзу, даже from и to не меняет местами. Описание namespace-а добавилось из-за баблера (пока не придумал, как убрать объявление).

ma1uta

словил забавный баг (?). Openfire открывает исходящее соединение s2s и после handshake-а присылает <db:result/> (префиксы в именах тегов без namespace в xml — это что-то с чем-то). В ответ открываем соединение на Authoritive Service, в качестве которого выступает тот же openfire и отправляем <db:verify/> ему обратно. В итоге мало того, что openfire на входящее соединение открывает ещё одно исходящее вдобавок к самому первому, так он через это новое исходящее соединение присылает тот же самый <db:verify/>. Даже from и to не меняет местами. Сходу не нашёл место, где он происходит, буду копать дальше.

ma1uta

Вот все жалуются, я тоже пожалуюсь. Есть такая библиотека xmpp.rocks (или просто babbler, баблер). В целом она вполне себе неплохая, но есть у неё одна особенность, которая навевает грусть и печаль, а именно то, что автор очень сильно любит добавлять везде слово `final` и делать методы `private`. В итоге, когда делаешь всё по примерам, всё работает, шаг влево-вправо — начинается боль и страдание. Первый раз с таким столкнулся, когда потребовалось для external component слать presence в комнату от разных resource. Решилось дело тем, что пришлось скопировать 5 классов (не от наследоваться!) и в один метод добавить три строки. Также в бабблере есть заготовка под c2s на базе netty. Слов нет, кодеки и соединение работают вполне нормально. А даже его можно использовать для входящих s2s. Для исходящих понадобилось переопределить один метод (редкий случай, когда метод оказался `protected`, а класс не `final`). Но с ServerDialback уже боль и страдание, а именно отправить теги `db:result` и `db:verify` не получится, несмотря ни на какие манипуляции (в том числе и с jaxb). Там жестко захардкожен в `private static final` переменной список namespace-ов, для которых будет писаться префикс, и dialback-а среди них нет. При этом это всё лежит в классах в xmpp-core с видимостью package (не public). Если выносить все классы, чтобы сделать dialback по-человечески, то надо будет копировать уже порядка 6-10 классов. :( Грусть, пичаль. Хоть выкидывай бабблер.