asyncore - Client

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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!
the more they change the more they stay the same
Antworten