QtNetwork.QTcpServer - Events
Unsolved
German
-
Win10 / Python 3.10
Nach längerem hin und her habe ich das Qt-Framework gefunden.
Neben der komfortablen Nutzung von UI-Elementen möchte ich auch die Netzwerkunterstützung nutzen.Der Server inclusive des Clienthandlings laufen soweit:
class Client(QtCore.QObject): def SetSocket(self, socket): self.rx_counter = 0 self.tx_counter = 0 self.socket = socket self.socket.connected.connect(self.on_connected) self.socket.disconnected.connect(self.on_disconnected) self.socket.readyRead.connect(self.on_readyRead) frm_main.print_memo("Client Connected from {}:{}".format(self.socket.peerAddress().toString(), self.socket.peerPort())) def on_connected(self): frm_main.print_memo("Client Connected Event") def on_disconnected(self): frm_main.print_memo("Client Disconnected") def on_readyRead(self): msg = self.socket.read(2) bytes_to_read = int.from_bytes(msg[1], "big") msg += self.socket.read(bytes_to_read) data = bytearray(msg) if data[0] == 0x68: #start if data[1] == len(data)-2: #S-Frame if data[2] & 0b00000011 == 0b01: #01 S-Frame self.handle_sFrame(data) #U-Frame if data[2] & 0b00000011 == 0b11: #11 U-Frame self.handle_uFrame(data) #I-Frame if data[2] & 0b00000001 == 0b0: #.0 I-Frame self.rx_counter += 1 self.handle_iFrame(data) else: frm_main.print_memo("Wrong size of incomming IEC 60870-5-104 Frame") class Server(QtCore.QObject): def __init__(self, parent=None): QtCore.QObject.__init__(self) self.TCP_LISTEN_TO_PORT = 2404 self.server = QtNetwork.QTcpServer() self.server.newConnection.connect(self.on_newConnection) self.server.serverPort = self.TCP_LISTEN_TO_PORT self.ip = QtNetwork.QHostAddress() self.ip.setAddress("127.0.0.1") def on_newConnection(self): while self.server.hasPendingConnections(): frm_main.print_memo("Incoming Connection...") self.client = Client(self) self.client.SetSocket(self.server.nextPendingConnection()) def StartServer(self): if self.server.listen(self.ip, self.TCP_LISTEN_TO_PORT): #QtNetwork.QHostAddress.Any frm_main.print_memo( "Server is listening on {}:{}".format(self.ip.toString(), self.TCP_LISTEN_TO_PORT)) else: frm_main.print_memo("Server couldn't wake up")
Verständnisprobleme habe ich mit diesen functions:
self.socket.connected.connect(self.on_connected) self.socket.disconnected.connect(self.on_disconnected) self.socket.readyRead.connect(self.on_readyRead)
- on_readyRead: läuft wie erwartet.
- on_connected: diese function wird bisher gar nicht aufgerufen. Nicht so schlimm, hätte ich aber anders erwartet.
- on_disconnected: wir nur aufgerufen wenn der Client endgültig geschlossen wurde. Hier hätte ich erwartet, dass ein "durchbooten" des Clients erkannt wird. Das hat zur Folge, dass mein Client offen bleibt und der durchgebootete Client eine neue Verbindung und damit einen weiteren Client startet.
Kann mir hier einen Tipp geben?
Gruß
pf@nne