Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [PyQt] и XMPP (xmpppy), Thread не рвёт сессию 
:(
    Опции темы
necrozyablo
Дата 19.5.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Вот решил прикрутить к своему GUI возможность посылать логи по xmpp ну и принимать удалённо команды.

Вот есть обычный рабочий код для работы с xmpp
Код
 
class JabberBot():

    def __init__(self):
        self.password='blablalba' # пароль для  self.jid
        self.jid='[email protected]' #c него посылаются 
        self.jid2='[email protected]' #ему приходят
        self.jid3='[email protected]' #от него управляющие команды
        
        jid=xmpp.protocol.JID(self.jid)
        self.server = jid.getDomain()
        self.user = jid.getNode()
    
    def connect_jid(self):
    
        
        self.conn = xmpp.Client(self.server, debug = [])
        if (self.server=='gmail.com'):
            print ('connect to google ', self.server)
            conres = self.conn.connect(('talk.google.com',5223))
        else:
            conres = self.conn.connect()
            
        if not conres:
            print "Unable to connect to server %s!" % self.server
            sys.exit(1)

        if conres == 'tls':
            print "We have TLS connection!"
        elif conres == 'ssl':
            print "We have SSL connection!"
        else: 
            print "Warning: unable to estabilish secure connection - TLS & SSL failed!"

        authres = self.conn.auth(self.user, self.password)

        if not authres:
            print "Unable to authorize on %s - check login/password." % self.server
            sys.exit(1)

        if authres <> 'sasl':
            print """Warning: unable to perform SASL auth os %s.
                   Old authentication method used!""" % self.server
                   
        #устанавливаем статус
        presence = xmpp.Presence(status = "Ready!", show ="chat", priority = '1')
        self.conn.send(presence)
      
        #return myclient
        
    def send(self,text):
        print text
        mymsg=xmpp.protocol.Message(self.jid2,text, "chat")
        self.conn.send(mymsg)
        print mymsg

    def message_handler(self, conn, message):
        print "new message!"

        if (re.findall(r'^('+self.jid3+r')/', str(message.getFrom()))):
            command=str(message.getBody())
            print "from: " + str(message.getFrom())
            print "msg: " + str(message.getBody())
            if (command=='exit'):
                print 'exit'
                try:
                    self.conn.disconnected()
                except:
                    print 'errrrrr'
                self.exit=1
                
        else:
            print 'msg not in trust'
        
    def run(self):
        
        self.connect_jid()
        self.conn.RegisterHandler('message', self.message_handler)
        while self.step_on(): pass
        
    def step_on(self):
        if (self.exit==1): return 0
        try:
            self.conn.Process(1)
            print 1
        except KeyboardInterrupt: return 0
        return 1
        
        
bot = JabberBot()
bot.run()

Собственно этот код нормально работает если послать команду 'exit' то будет выполнятся 
            if (command=='exit'):
                print 'exit'
                try:
                    self.conn.disconnected()
                except:
                    print 'errrrrr'
                self.exit=1

В принципе достаточно чисто  self.exit и тогда всё выйдет, self.conn.disconnected() здесь так для избыточности.

Но вот как только я всё это засовываю в QtCore.QThread - делаю class JabberBot(QtCore.QThread): 
Его я активирую как обычно через 

        self.jb = JabberBot(self)
        self.jb.start()

Собсвтенно всё работает команды принимаются, сообщения отправляются. Но проблема в том что когда я посылаю exit сессия не закрывается. Т.е. в окне контактов мой jabberbot продолжает висеть. При этом видно что в  "def step_on(self)" перестаёт принтится " print 1", да и если сделать 

        if self.jb.isRunning():
            print 'qqqq'
        else:
            print 'zzzz'

Мне выдаёт 'zzzz', что говорит о завершении работа этого thread. Но при этом контакт в листе активен и ведь даже self.conn.disconnected() не помогло...
Но как только я завершаю работу программы мой бот сразу исчезает из листа.
Даже не знаю куда копать чтобы понять в чём дело...
PM MAIL   Вверх
mrDoctorWho
Дата 28.10.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 28.10.2011

Репутация: нет
Всего: нет



self.conn.disconnect()

Или отправка презенса unavailable в ростер. А лучше self.conn.RegisterDisconnectHandler(sys.exit).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Разработка GUI | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.