Russian Qt Forum

Qt => Работа с сетью => Тема начата: vinceras от Август 27, 2010, 13:16



Название: Jabber клиент на основе QXMPP
Отправлено: vinceras от Август 27, 2010, 13:16
Всем доброго время суток. Понадобилось написать свой jabber клиент. Решил испольтзовать QXMMP. Пока начал по минимуму:
1. Создал форму авторизации с логином и паролем; Для тестирования зарегился на jabber.org
2. В main.cpp пытаюсь приконектиться к серверу и провести проверку, если соединение прошло удачно, то загружать основное окно. Однако client->isConnected() все время возвращает false.

Вот кусок кода main.cpp

Код:

#include <QtGui/QApplication>
#include <QTextCodec>
#include <QTranslator>
#include "mainwindow.h"
#include "authorisationdialog.h"
#include <QMessageBox>
#include "qxmpp/QXmppLogger.h"
#include "qxmpp/QXmppClient.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); ///< Для строковых констант
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));  ///< Для функций перевода tr()
    QTranslator *qt_translator = new QTranslator;
    if ( qt_translator->load( ":tr/qt_ru.qm" ) )
    {
        a.installTranslator( qt_translator );
    }
    AuthorisationDialog AuthDialog;
    if (AuthDialog.exec() == QDialog::Accepted)
    {
        QXmppLogger::getLogger()->setLoggingType(QXmppLogger::FileLogging);
        QXmppClient *client = new QXmppClient;
        client->connectToServer("jabber.org", AuthDialog.username,AuthDialog.password, "jabber.org");
        if (client->isConnected())
        {
            MainWindow w;
            w.show();
        }
        
        return a.exec();
    }
}


В QXmppClientLog.log:

Цитировать

12:50:40.883 INFO Connecting to: jabber.org:5222

12:50:41.023 DEBUG Host found

12:50:41.211 INFO Connected

12:50:41.211 SENT <?xml version='1.0'?><stream:stream to='jabber.org' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/
streams' version='1.0'>

12:50:41.429 RECEIVED <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'
from='jabber.org' id='9323103ab3cb9ad2' version='1.0'><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/
><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>CRAM-MD5</mechanism><mechanism>LOGIN</
mechanism><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism><mechanism>SCRAM-SHA-1</mechanism></
mechanisms><compression xmlns='http://jabber.org/features/compress'><method>zlib</method></compression><ver
xmlns='urn:xmpp:features:rosterver'><optional/></ver></stream:features>

12:50:41.429 SENT <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>

12:50:41.617 RECEIVED <challenge xmlns='urn:ietf:params:xml:ns:xmpp-
sasl'>bm9uY2U9IjMrOVUxVllBTnZGQUQvNjdRdzhKc0gvTUtKUFZLb3Y0Q1EvelNWb1MwdFE9IixyZWFs
bT0iamFiYmVyLm9yZyIscW9wPSJhdXRoIixtYXhidWY9MTYzODQsY2hhcnNldD11dGYtOCxhbGdvcml0a
G09bWQ1LXNlc3M=</challenge>

12:50:41.617 SENT <response xmlns='urn:ietf:params:xml:ns:xmpp-
sasl'>Y2hhcnNldD11dGYtOCxjbm9uY2U9Im02cGRtNEYvVmpaZE1YWUQ3UkszMVFVOWV1RnZvWk5SV
EhJU2NyRUZ6c1U9IixkaWdlc3QtdXJpPSJ4bXBwL2phYmJlci5vcmciLG5jPTAwMDAwMDAxLG5vbmNlPSIz
KzlVMVZZQU52RkFELzY3UXc4SnNIL01LSlBWS292NENRL3pTVm9TMHRRPSIscW9wPWF1dGgscmVhbG0
9amFiYmVyLm9yZyxyZXNwb25zZT0xMTg1NDJmNDFiYmI2NjhlZmZlMzM1Y2EyMmZiNjc0Yix1c2VybmFtZ
T1ydWJlemg=</response>

12:50:41.898 RECEIVED <success xmlns='urn:ietf:params:xml:ns:xmpp-
sasl'>cnNwYXV0aD00MjJiNDUwYmFmYTEzM2IzM2MwOThmYzZlMjZkNjRjNQ==</success>

12:50:41.898 DEBUG Authenticated

12:50:41.898 SENT <?xml version='1.0'?><stream:stream to='jabber.org' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/
streams' version='1.0'>

12:50:42.086 RECEIVED <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'
from='jabber.org' id='83b1068991ccb2fa' version='1.0'><stream:features><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><required/
></bind><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/><compression xmlns='http://jabber.org/features/
compress'><method>zlib</method></compression><ver xmlns='urn:xmpp:features:rosterver'><optional/></ver></stream:features>

12:50:42.086 SENT <iq id="qxmpp4" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>QXmpp</resource>
</bind></iq>

12:50:42.273 RECEIVED <iq to='rubezh@jabber.org/QXmpp' type='result' id='qxmpp4'><bind xmlns='urn:ietf:params:xml:ns:xmpp-
bind'><jid>rubezh@jabber.org/QXmpp</jid></bind></iq>

12:50:42.273 SENT <iq id="qxmpp6" to="jabber.org" type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>

12:50:42.461 RECEIVED <iq from='jabber.org' type='result' id='qxmpp6'/>

12:50:42.461 SENT <presence><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://code.google.com/p/qxmpp"
ver="b9jg2r3aRswRJCZ08qidhNU6/LQ="/></presence>

12:50:42.476 SENT <iq id="qxmpp8" from="rubezh@jabber.org/QXmpp" type="get"><query xmlns="jabber:iq:roster"/></iq>

12:50:42.711 RECEIVED <presence from='rubezh@jabber.org/QXmpp' to='rubezh@jabber.org/QXmpp'><c xmlns="http://jabber.org/
protocol/caps" hash="sha-1" node="http://code.google.com/p/qxmpp" ver="b9jg2r3aRswRJCZ08qidhNU6/LQ="/></presence><iq
to='rubezh@jabber.org/QXmpp' type='result' id='qxmpp8'><query xmlns='jabber:iq:roster' ver='0'></query></iq>

12:51:42.462 SENT <iq id="qxmpp10" to="jabber.org" from="rubezh@jabber.org/QXmpp" type="get">
<ping xmlns="urn:xmpp:ping"/></iq>

12:51:42.649 RECEIVED <iq from='jabber.org' to='rubezh@jabber.org/QXmpp' type='result' id='qxmpp10'/>

12:52:42.463 SENT <iq id="qxmpp13" to="jabber.org" from="rubezh@jabber.org/QXmpp" type="get">
<ping xmlns="urn:xmpp:ping"/></iq>

12:52:42.651 RECEIVED <iq from='jabber.org' to='rubezh@jabber.org/QXmpp' type='result' id='qxmpp13'/>

Помогите пожалуйста разобраться кто работал с qxmpp?


Название: Re: Jabber клиент на основе QXMPP
Отправлено: merke от Август 27, 2010, 15:26
код который ты выложил не даст в жизни разобраться с проблемой. Выкладывай исходники класса QXmppClient.


Название: Re: Jabber клиент на основе QXMPP
Отправлено: Пантер от Август 27, 2010, 16:30
Покопай psi, он на Кьютах написан.


Название: Re: Jabber клиент на основе QXMPP
Отправлено: БАТ от Август 27, 2010, 20:25
А сюда заглядывал http://code.google.com/p/qxmpp/wiki/UsingQXmpp (http://code.google.com/p/qxmpp/wiki/UsingQXmpp)


Название: Re: Jabber клиент на основе QXMPP
Отправлено: crossly от Август 31, 2010, 09:54
c QXMPP дело не имел... но подозреваю что  if (client->isConnected()) вызывается раньше чем процедура соединения отработает....


Название: Re: Jabber клиент на основе QXMPP
Отправлено: vinceras от Сентябрь 01, 2010, 07:50
А сюда заглядывал http://code.google.com/p/qxmpp/wiki/UsingQXmpp (http://code.google.com/p/qxmpp/wiki/UsingQXmpp)

Заглядывал, только читал не внимательно...Мне нужно использовать вместо isConnected() сигнал connected(), он же используеться и в примерах.
Вот описание с http://qxmpp.googlecode.com/svn/doc/HEAD/html/classQXmppClient.html (http://qxmpp.googlecode.com/svn/doc/HEAD/html/classQXmppClient.html)
Цитировать
void QXmppClient::connected()    [signal]


This signal is emitted when the client connects successfully to the XMPP server i.e. when a successful XMPP connection is established. XMPP Connection involves following sequential steps:
TCP socket connection
Client sends start stream
Server sends start stream
TLS negotiation (encryption)
Authentication
Resource binding
Session establishment

After all these steps a successful XMPP connection is established and connected() signal is emitted.

After the connected() signal is emitted QXmpp will send the roster request to the server. On receiving the roster, QXmpp will emit
QXmppRosterManager::rosterReceived(). After this signal, QXmppRosterManager object gets populated and you can use rosterManager()
to get the handle of QXmppRosterManager object.

Хотя, вот описание isConnected():

Цитировать
bool QXmppClient::isConnected( ) const

Returns true if the client is connected to the XMPP server.


Название: Re: Jabber клиент на основе QXMPP
Отправлено: Grom от Сентябрь 05, 2010, 14:30
Думаю все дело в не блокируемом режиме, надо хватать сигналы(подсоединения),
а если через isConnect то только в отдельном потоке опрашивать, пока не законнектится и не выдаст true.

Код быстрее долетает до if( )  - чем устанавливается соединение.


Название: Re: Jabber клиент на основе QXMPP
Отправлено: stump от Октябрь 02, 2010, 15:55
Никто не пробовал в контакт через QXmpp отправлять сообщения??


Название: Re: Jabber клиент на основе QXMPP
Отправлено: bvn13 от Октябрь 02, 2010, 21:23
посмотри примеры. там все просто и понятно.


Название: Re: Jabber клиент на основе QXMPP
Отправлено: stump от Октябрь 03, 2010, 11:13
посмотри примеры. там все просто и понятно.

Согласен.Все просто, понятно, но ничего не работает...

Отправляю сообщения, используя QXmppClient::sendPacket (const QXmppPacket &)...
В логах прописывается, что <message></message> отправлен...но в реале ничего не приходит...
Сообщение доходит только в том случае, если я отправляю его сразу по принятии сигнала QXmppClient::connected()...и все...в произвольный момент времени отправлять сообщения не получается...мистика  :-\


Название: Re: Jabber клиент на основе QXMPP
Отправлено: bvn13 от Октябрь 03, 2010, 20:11
я в примерах изменил подключение на свои данные - все работает.


Название: Re: Jabber клиент на основе QXMPP
Отправлено: stump от Октябрь 13, 2010, 21:09
я в примерах изменил подключение на свои данные - все работает.

именно к контакту??  :o
можешь пример выложить??


Название: Re: Jabber клиент на основе QXMPP
Отправлено: bvn13 от Октябрь 17, 2010, 20:36
Взять тот же эхо-клиент.

main.cpp:

Код:
#include <QtCore/QCoreApplication>
#include "echoClient.h"
#include "QXmppLogger.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
   
    QXmppLogger::getLogger()->setLoggingType(QXmppLogger::StdoutLogging);

    echoClient client;
    client.connectToServer("qxmpp.test1@gmail.com", "qxmpp123");
    return a.exec();
}

echoclient.h:

Код:
#ifndef ECHOCLIENT_H
#define ECHOCLIENT_H

#include "QXmppClient.h"

class echoClient : public QXmppClient
{
    Q_OBJECT

public:
    echoClient(QObject *parent = 0);
    ~echoClient();

public slots:
    void messageReceived(const QXmppMessage&);
};

#endif // ECHOCLIENT_H

echoclient.cpp:

Код:
#include "echoClient.h"
#include "QXmppMessage.h"

echoClient::echoClient(QObject *parent)
    : QXmppClient(parent)
{
    bool check = connect(this, SIGNAL(messageReceived(const QXmppMessage&)),
        SLOT(messageReceived(const QXmppMessage&)));
    Q_ASSERT(check);
    Q_UNUSED(check);
}

echoClient::~echoClient()
{

}

void echoClient::messageReceived(const QXmppMessage& message)
{
    QString from = message.from();
    QString msg = message.body();

    sendPacket(QXmppMessage("", from, "Your message: " + msg));
}


клиент коннектится под аккаунтом, слушает все, что ему придет, и отвечает тем же сообщением. но смысл понятен


Название: Re: Jabber клиент на основе QXMPP
Отправлено: stump от Октябрь 18, 2010, 18:44
нужен пример именно с vk.com, а не с gmail.com  :-[


Название: Re: Jabber клиент на основе QXMPP
Отправлено: crossly от Октябрь 18, 2010, 19:45
а какая разница??


Название: Re: Jabber клиент на основе QXMPP
Отправлено: BloodyTux от Октябрь 23, 2010, 18:01
Цитировать
нужен пример именно с vk.com, а не с gmail.com  Обеспокоенный

Если еще актульно - я делал клиент под сервер Вконтакте. Через vk.com QXmpp не работает, зато работает через vkmessanger.com.  :)


Название: Re: Jabber клиент на основе QXMPP
Отправлено: stump от Октябрь 24, 2010, 07:51

Если еще актульно - я делал клиент под сервер Вконтакте. Через vk.com QXmpp не работает, зато работает через vkmessanger.com.  :)

 8) я так и знал! а при использовании vkmessanger.com, есть какие-то заморочки с DNS?? просвети  ;)


Название: Re: Jabber клиент на основе QXMPP
Отправлено: BloodyTux от Октябрь 24, 2010, 10:12
Как раз никаких заморочек. С официального сайта:

Цитировать
Для клиентов, не поддерживающих работу с DNS-записями, в качестве сервера нужно указать vkmessenger.com.