Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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 ''
Пример #5
0
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 ''
Пример #6
0
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 :