class UdpServer(QObject): datagram = pyqtSignal(str) def __init__(self, host): super().__init__() self._sock = QUdpSocket() self._host = host self._log = logging.getLogger("udp") self._sock.readyRead.connect(self.recv) bind(self._sock) def set_host(self, host): self._host = host @pyqtSlot(str) def try_connect(self, port): self._sock.disconnectFromHost() if self._sock.state() != QAbstractSocket.UnconnectedState: self._sock.waitForDisconnected() port = int(port) msg = "connecting to ({}:{})" msg = msg.format(self._host.toString(), port) self._log.debug(msg) self._sock.connectToHost(self._host, port) self._sock.write("_:start\n") def recv(self): while self._sock.hasPendingDatagrams(): data = self._sock.readDatagram(BUFFER_SIZE) data = data[0] message = data.decode() for line in message.split("\n"): if line == "": continue self.datagram.emit(line)
class UdpServer(QObject): datagram = pyqtSignal(str) def __init__(self, host): super().__init__() self._sock = QUdpSocket() self._host = host self._log = logging.getLogger('udp') self._sock.readyRead.connect(self.recv) bind(self._sock) def set_host(self, host): self._host = host @pyqtSlot(str) def try_connect(self, port): self._sock.disconnectFromHost() if self._sock.state() != QAbstractSocket.UnconnectedState: self._sock.waitForDisconnected() port = int(port) msg = 'connecting to ({}:{})' msg = msg.format(self._host.toString(), port) self._log.debug(msg) self._sock.connectToHost(self._host, port) self._sock.write('_:start\n') def recv(self): while self._sock.hasPendingDatagrams(): data = self._sock.readDatagram(BUFFER_SIZE) data = data[0] message = data.decode() for line in message.split('\n'): if line == '': continue self.datagram.emit(line)
class QUdpTransport(Transport): '''A Transport sending and receiving UDP datagrams. Connectionless - sender/receiver are IP addresses. Sending and receiving is done on the same port. Sending with receiver=None makes a broadcast. Use messages > 500 Byte at your own peril. Received data is processed on the Qt mainloop thread. ''' shorthand='qudp' @classmethod def fromstring(cls, expression): '''qudp:<port>''' _, port = expression.split(':') return cls(port=int(port)) def __init__(self, port): self.port = port self.leftover = b'' self.socket = QUdpSocket() self.socket.readyRead.connect(self.on_ready_read) self.socket.error.connect(self.on_error) def start(self): if self.socket.state() != QAbstractSocket.UnconnectedState: L().debug('QUdpSocket.start(): Socket is not in UnconnectedState, doing nothing') return L().debug('QUdpTransport: binding to port %d'%(self.port,)) self.socket.bind(self.port, QUdpSocket.ShareAddress) def stop(self): self.socket.flush() self.socket.close() def send(self, data, receivers=None): L().debug('message to udp %s: %s'%(receivers,data)) data = data.decode('utf8') if receivers: for receiver in receivers: self.socket.writeDatagram(data, QHostAddress(receiver), self.port) else: self.socket.writeDatagram(data, QHostAddress.Broadcast, self.port) def on_ready_read(self): while self.socket.hasPendingDatagrams(): data, host, port = self.socket.readDatagram(self.socket.pendingDatagramSize()) assert isinstance(data, bytes) sender = host.toString() pdata = data if len(pdata) > 100: pdata = pdata[:100] + b'...' L().debug('UDP message from %s: %s'%(sender, pdata)) self.leftover = self.received( sender=sender, data=self.leftover + data ) def on_error(self, error): L().info('QTcpSocket raised error: %s'%error)
class UdpDevice(DataDevice): ''' Implementation of a UDP server socket ''' readyRead = pyqtSignal() def __init__(self, params={}, parent=None): ''' Constructor ''' super(UdpDevice, self).__init__(params, parent) self.iodevice = QUdpSocket() self.reconnect = int(params.get('Reconnect', 1000)) self.host = params.get('Host', None) self.port = int(params.get('Port', 2000)) self.iodevice.readyRead.connect(self.readyRead) self.buffer = list() def connectDevice(self): result = False if self.host is None: result = self.iodevice.bind(self.port) else: ha = QHostAddress(self.host) result = self.iodevice.bind(ha, self.port) if result is False: if self.reconnect > 0: QTimer.singleShot(self.reconnect, self.onReconnectTimer) else: self.deviceConnected.emit(True) def disconnectDevice(self): if self.iodevice.state() is QAbstractSocket.BoundState: self.iodevice.disconnectFromHost() self.deviceDisconnected.emit(True) def readData(self): (data, ha, port) = self.iodevice.readDatagram( self.iodevice.pendingDatagramSize()) self.remoteHost = ha.toString() self.remotePort = port return data def readLine(self): if self.iodevice.hasPendingDatagrams(): self.buffer.extend(self.readData()) try: i = self.buffer.index('\n') data = self.buffer[0:i] del self.buffer[0:i + 1] return ''.join(data) except ValueError: return ''
class UdpDevice(DataDevice): ''' Implementation of a UDP server socket ''' readyRead = pyqtSignal() def __init__(self, params={}, parent=None): ''' Constructor ''' super(UdpDevice, self).__init__(params, parent) self.iodevice = QUdpSocket() self.reconnect = int(params.get('Reconnect', 1000)) self.host = params.get('Host', None) self.port = int(params.get('Port', 2000)) self.iodevice.readyRead.connect(self.readyRead) self.buffer = list() def connectDevice(self): result = False if self.host is None: result = self.iodevice.bind(self.port) else: ha = QHostAddress(self.host) result = self.iodevice.bind(ha, self.port) if result is False: if self.reconnect > 0: QTimer.singleShot(self.reconnect, self.onReconnectTimer) else: self.deviceConnected.emit(True) def disconnectDevice(self): if self.iodevice.state() is QAbstractSocket.BoundState: self.iodevice.disconnectFromHost() self.deviceDisconnected.emit(True) def readData(self): (data, ha, port) = self.iodevice.readDatagram(self.iodevice.pendingDatagramSize()) self.remoteHost = ha.toString() self.remotePort = port return data def readLine(self): if self.iodevice.hasPendingDatagrams(): self.buffer.extend(self.readData()) try: i = self.buffer.index('\n') data = self.buffer[0:i] del self.buffer[0:i + 1] return ''.join(data) except ValueError: return ''
class UdpClient(QThread): def __init__(self, parent): QThread.__init__(self, parent) self.prnt = parent self.udp = QUdpSocket() addr = QHostAddress(QHostAddress.Any) print 'bind to:', addr.toString() self.udp.bind(addr, 34001) self.udp.error.connect(self.errorAnalyser) self.udp.readyRead.connect(self.readUdp) print "Binding..." self.STOP = False self.locker = QMutex() def run(self): self.prnt.initAvahiService() while True : if self.udp is not None and self.udp.state() == QAbstractSocket.ConnectedState : self.udp.waitForReadyRead() else : self.msleep(100) if self.STOP and self.udp is not None: self.udp.close(); break print 'UDPClient closed...' self.prnt.changeConnectState.emit() def stop(self): self.locker.lock() self.STOP = True self.locker.unlock() def readUdp(self): while ( self.udp.hasPendingDatagrams() ): data = QByteArray() addr = QHostAddress() port = 0 try : datagramSize = self.udp.pendingDatagramSize() if datagramSize > 0 : (data, addr, port) = self.udp.readDatagram(datagramSize) #print "Datagram: [%s] from %s:%i" % (QString().fromUtf8(data), addr.toString(), port) self.prnt.contactMessage.emit(QString().fromUtf8(data), addr.toString()) except socket.error, err : print '[in readUdp() UdpClient] SocketError1 : ', err except socket.timeout, err : print '[in readUdp() UdpClient] SocketError2 : ', err except :