Seite 1 von 1

asyncore - Client

Verfasst: Donnerstag 12. November 2009, 17:27
von Dav1d
Ich habe einen Clienten geschrieben, der auch super funktioniert, nur ein Problem hat er, wenn man längere Zeit nichts gesendet hat (auser auf Pings geantwortet), dann einen Text senden will, wird er nicht gesendet! Wenn man kurz darauf nochmal einen Text sendet, kommt dieser an!

GUI mit wxPython

Kleines excerpt:

Code: Alles auswählen

class ClientConnection(asyncore.dispatcher):
    def __init__(self, server, nick, ipv6=False):
        asyncore.dispatcher.__init__(self)
        if ipv6:
            self.create_socket(socket.AF_INET6, socket.SOCK_STREAM)
        else:
            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((server, 5000))
        self.buffer = ''
        self.nick = nick
        self.lines = []
            
    def handle_connect(self):
        self.send('NICK %s\r\n' % (self.nick))
    def handle_close(self):
        self.close()

    def handle_read(self):
        f = self.recv(2**14)
        self.lines.append(f)
    def handle_write(self):
        sent = self.send(self.buffer)
        self.buffer = self.buffer[sent:]

Jetzt, wird das ganze aufgerufen:

Code: Alles auswählen

    def manage_connection(self, event):
        asyncore.poll()
        for server in self.server:
            data = server.lines
            for line in data:
                print line # Nur'n Beispiel, da mach ich schon mehr ;)
            server.lines =  []
            
            
        for tab in self.tabs:
            if tab.sendbuf:
                for msg in tab.sendbuf:
                    self.tabs[tab][0].send(msg)
                tab.sendbuf = []
self.server = {server : tab, nick}, in dem alle ClientConnection-Objekte gespeichert werden (da man auf mehrere Server connecten können sollte)

self.tabs = {tab_object : (server, channel)} in dem alle "Tabs" gespeichert werden, "Tabs" sind Tabs von einem wx.aui.NoteBook()

tab.sendbuf = Gespeicherte Nachricht zum senden. Auf dem Tab ist eine TextCtrl, wenn man ENTER drückt, wird die Nachricht ausgelesen und in der Liste self.sendbuf gespeichert


//oh, was vergessen, manage_connection wird alle 0.3sekunden aufgerufen (wx.Timer())


Ich hoffe ihr könnt mir helfen
mfg

Verfasst: Freitag 13. November 2009, 19:46
von Dav1d
Es liegt irgendiwe am asyncore-Modul, ich hab mir die Klasse jetzt umgeschriben, sie nutzt jetzt zwar Threads (was ich eigentlich nicht wollte), aber es geht!