【问题标题】:PyQt4's udp broadcast doesn't seem to workPyQt4 的 udp 广播似乎不起作用
【发布时间】:2011-12-12 14:37:53
【问题描述】:

我用 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)

【问题讨论】:

    标签: python udp pyqt4 broadcast


    【解决方案1】:

    在您的客户端中,您没有启动 Qt 的事件循环。您应该分配一个应用程序对象并对其调用 exec_ 并通过计时器处理 debug_msg 调用,或者您应该使用 QCoreApplication.processEvents() 泵送事件循环。

    另一种选择是使用flush():

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

    bool QAbstractSocket::flush ()

    这个函数尽可能从内部写入 缓冲到底层网络套接字,没有阻塞。如果有任何数据 写好了,这个函数返回true;否则返回 false。

    如果需要 QAbstractSocket 开始发送,请调用此函数 立即缓冲数据。成功写入的字节数 取决于操作系统。在大多数情况下,您不需要 调用这个函数,因为 QAbstractSocket 会开始发送数据 一旦控制回到事件循环就会自动。离席期间 事件循环,调用 waitForBytesWritten() 代替。

    【讨论】:

      【解决方案2】:

      QtNetwork.QUdpSocket.NetworkError 不是异常类型,而只是一个常量。而且,为什么要将套接字绑定到QHostAddress.Broadcast。您需要 QHostAddress.Any 代替吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-20
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多