Russian Qt Forum
Ноябрь 24, 2024, 01:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Jabber клиент на основе QXMPP  (Прочитано 16973 раз)
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?
« Последнее редактирование: Сентябрь 01, 2010, 08:01 от vinceras » Записан
merke
Гость
« Ответ #1 : Август 27, 2010, 15:26 »

код который ты выложил не даст в жизни разобраться с проблемой. Выкладывай исходники класса QXmppClient.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Август 27, 2010, 16:30 »

Покопай psi, он на Кьютах написан.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
БАТ
Гость
« Ответ #3 : Август 27, 2010, 20:25 »

А сюда заглядывал http://code.google.com/p/qxmpp/wiki/UsingQXmpp
Записан
crossly
Гость
« Ответ #4 : Август 31, 2010, 09:54 »

c QXMPP дело не имел... но подозреваю что  if (client->isConnected()) вызывается раньше чем процедура соединения отработает....
Записан
vinceras
Гость
« Ответ #5 : Сентябрь 01, 2010, 07:50 »

А сюда заглядывал http://code.google.com/p/qxmpp/wiki/UsingQXmpp

Заглядывал, только читал не внимательно...Мне нужно использовать вместо isConnected() сигнал connected(), он же используеться и в примерах.
Вот описание с 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.
Записан
Grom
Гость
« Ответ #6 : Сентябрь 05, 2010, 14:30 »

Думаю все дело в не блокируемом режиме, надо хватать сигналы(подсоединения),
а если через isConnect то только в отдельном потоке опрашивать, пока не законнектится и не выдаст true.

Код быстрее долетает до if( )  - чем устанавливается соединение.
Записан
stump
Гость
« Ответ #7 : Октябрь 02, 2010, 15:55 »

Никто не пробовал в контакт через QXmpp отправлять сообщения??
Записан
bvn13
Гость
« Ответ #8 : Октябрь 02, 2010, 21:23 »

посмотри примеры. там все просто и понятно.
Записан
stump
Гость
« Ответ #9 : Октябрь 03, 2010, 11:13 »

посмотри примеры. там все просто и понятно.

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

Отправляю сообщения, используя QXmppClient::sendPacket (const QXmppPacket &)...
В логах прописывается, что <message></message> отправлен...но в реале ничего не приходит...
Сообщение доходит только в том случае, если я отправляю его сразу по принятии сигнала QXmppClient::connected()...и все...в произвольный момент времени отправлять сообщения не получается...мистика  В замешательстве
Записан
bvn13
Гость
« Ответ #10 : Октябрь 03, 2010, 20:11 »

я в примерах изменил подключение на свои данные - все работает.
Записан
stump
Гость
« Ответ #11 : Октябрь 13, 2010, 21:09 »

я в примерах изменил подключение на свои данные - все работает.

именно к контакту??  Шокированный
можешь пример выложить??
Записан
bvn13
Гость
« Ответ #12 : Октябрь 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));
}


клиент коннектится под аккаунтом, слушает все, что ему придет, и отвечает тем же сообщением. но смысл понятен
Записан
stump
Гость
« Ответ #13 : Октябрь 18, 2010, 18:44 »

нужен пример именно с vk.com, а не с gmail.com  Обеспокоенный
Записан
crossly
Гость
« Ответ #14 : Октябрь 18, 2010, 19:45 »

а какая разница??
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 23.