Передача udp в PyQt4, похоже, не работает - PullRequest
2 голосов
/ 12 декабря 2011

Мое приложение, написанное на PyQt4, похоже, не получает никаких данных.Событие readyRead даже не запускается.Использование приложений является следующим:

python server.py -s -p 50000 #(server on port 50000)
python server.py -c -p 50000 #(client sending data to port 50000)

//

import sys
import time

from PyQt4 import QtNetwork, QtCore
from optparse import OptionParser

class Server(object):

    def __init__(self, port):

        self.port = port

        try:
            self.socket = QtNetwork.QUdpSocket()
            self.socket.bind(QtNetwork.QHostAddress.Broadcast, int(self.port), QtNetwork.QUdpSocket.ShareAddress)

            self.socket.readyRead.connect(self.receiver)

        except QtNetwork.QUdpSocket.NetworkError:
            print "EXCEPTION DURING INITIALIZING SERVER'S SOCKET"
            sys.exit(1)

    def receiver(self):
        print "DEBUG: RECEIVE"
        while(self.socket.hasPendingDatagrams()):
            try:
                size = self.socket.pendingDatagramSize()
                msg, host, port = self.socket.readDatagram(size)
            except:
                print "EXCEPTION DURING RECEIVEING AND READING DATAGRAM"
            else:
                print "HOST %s:%s MSG: %s" % (str(host), str(port), str(msg))

    def __del__(self):
        print "DESTRUCTOR"
        self.socket.close()

class Client(object):

    def __init__(self, port):

        self.port = port

        try:
            self.socket = QtNetwork.QUdpSocket()
        except:
            print "EXCEPTION DURING INITIALIZING CLIENT'S SOCKET"

        self.main_loop()

    def main_loop(self):
        for i in range(20):
            self.debug_msg()
            time.sleep(0.5)
        print "EXITING"
        self.socket.close()


    def debug_msg(self):
        msg = "DEBUG"
        self.socket.writeDatagram(msg, QtNetwork.QHostAddress.Broadcast, int(self.port))


if __name__ == "__main__":

    parser = OptionParser()
    parser.add_option("-p", "", action="store", type="string", dest="port")
    parser.add_option("-c", "", action="store_true", dest="client")
    parser.add_option("-s", "", action="store_true", dest="server")

    options, args = parser.parse_args()

    if not (options.server or options.client):
        print "Client/Server not specified. Could not continue..."
        sys.exit(1)

    elif not options.port:
        print "Server's port not specified. Could not continue..."
        sys.exit(1)

    else:

        if options.server:
            serv = Server(options.port)

            App = QtCore.QCoreApplication(sys.argv)
            sys.exit(App.exec_())
        else:
            client = Client(options.port)

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

В вашем клиенте вы не запускаете цикл обработки событий Qt.Вы должны выделить объект приложения и либо вызвать для него exec_ и обработать вызовы debug_msg через таймеры, либо вы должны прокачать цикл событий с помощью QCoreApplication.processEvents ().

Другой вариант - использовать flush ():

http://doc.qt.nokia.com/latest/qabstractsocket.html#flush

bool QAbstractSocket::flush ()

Эта функция записывает как можно больше данных из внутреннего буфера записи в нижележащий сетевой сокет, без блокировки.Если какие-либо данные были записаны, эта функция возвращает true;в противном случае возвращается false.

Вызовите эту функцию, если вам нужен QAbstractSocket для немедленной отправки буферизованных данных.Количество успешно записанных байтов зависит от операционной системы.В большинстве случаев вам не нужно вызывать эту функцию, потому что QAbstractSocket начнет отправку данных автоматически, как только управление вернется в цикл обработки событий.В отсутствие цикла обработки событий вместо этого вызовите waitForBytesWritten ().

0 голосов
/ 07 апреля 2012

QtNetwork.QUdpSocket.NetworkError не тип исключения, а просто константа.И зачем привязывать сокет к QHostAddress.Broadcast.Вам нужен QHostAddress.Any вместо?

...