Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QtNetwork.QTcpServer - Events

QtNetwork.QTcpServer - Events

Scheduled Pinned Locked Moved Unsolved German
1 Posts 1 Posters 405 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    Pfanne
    wrote on last edited by Pfanne
    #1

    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

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved