class QUdpSocket#

QUdpSocket 类提供了 UDP 套接字。 更多...

Inheritance diagram of PySide6.QtNetwork.QUdpSocket

摘要#

方法#

注意

此文档可能包含从C++自动翻译到Python的片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译有问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建工单的方式来通知我们。

详细描述#

警告

本节包含从C++自动翻译到Python的片段,可能存在错误。

UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。在可靠性不重要的情况下可以使用。QUdpSocketQAbstractSocket 的一个子类,允许您发送和接收UDP数据报。

使用 此类最常见的方法是通过使用 bind() 将地址和端口绑定,然后调用 writeDatagram()readDatagram()receiveDatagram() 进行数据传输。如果您想使用标准 QIODevice 函数 read()、readLine()、write() 等,则必须首先通过调用 connectToHost() 将套接字直接连接到对等方。

套接字每次将数据报写入网络时都会发出 bytesWritten() 信号。如果您只想发送数据报,则不需要调用 bind()

每当有数据报到达时,就会发出 readyRead() 信号。在这种情况下,hasPendingDatagrams() 返回 true。调用 pendingDatagramSize() 获取第一个待处理数据报的大小,然后使用 readDatagram()receiveDatagram() 读取它。

注意

在收到 readyRead() 信号时,应该读取传入的数据报,否则在下一个数据报的情况下不会发出此信号。

示例

def initSocket(self):

    udpSocket = QUdpSocket(self)
    udpSocket.bind(QHostAddress.LocalHost, 7755)
    udpSocket.readyRead.connect(
            self.readPendingDatagrams)

def readPendingDatagrams(self):

    while udpSocket.hasPendingDatagrams():
        datagram = udpSocket.receiveDatagram()
        processTheDatagram(datagram)

QUdpSocket 还支持 UDP 组播。使用 joinMulticastGroup()leaveMulticastGroup() 控制组成员身份,使用 MulticastTtlOptionMulticastLoopbackOption 设置 TTL 和回环套接字选项。使用 setMulticastInterface() 控制组播数据报的输出接口,并使用 multicastInterface() 查询它。

使用 QUdpSocket ,您还可以通过 connectToHost() 建立与 UDP 服务器的虚拟连接,然后使用 read() 和 write() 交换数据包,无需为每个数据包指定接收器。

广播发送器广播接收器多播发送器多播接收器 示例说明了如何在应用程序中使用 QUdpSocket

__init__([parent=None])#
参数:

parentQObject

创建一个 QUdpSocket 对象。

parent 传递给 QObject 构造函数。

参阅

socketType()

bind(addr[, port=0[, mode=QAbstractSocket.BindFlag.DefaultForPlatform]])#
参数:
返回类型:

bool

hasPendingDatagrams()#
返回类型:

bool

如果至少有一个数据包等待读取,则返回 true;否则返回 false

joinMulticastGroup(groupAddress)#
参数:

groupAddressQHostAddress

返回类型:

bool

使用系统默认接口将groupAddress所指定的多播组加入。套接字必须处于BoundState状态,否则将发生错误。

注意,如果您试图加入IPv4组,您的套接字不能使用IPv6(或在双模式下,使用Any ) 进行绑定。您必须使用AnyIPv4

此函数在成功时返回 true,否则返回 false 并根据套接字错误设置相应的错误。

注意

在某些操作系统中,不支持不指定接口选择而加入IPv6多播组。请考虑使用指定接口的重载版本。

joinMulticastGroup(groupAddress, iface)
参数:
返回类型:

bool

这是一个重载函数。

在界面 iface 上加入多播组地址 groupAddress

leaveMulticastGroup(groupAddress)#
参数:

groupAddressQHostAddress

返回类型:

bool

在使用操作系统选择的默认接口上离开由 groupAddress 指定的多播组。套接字必须处于BoundState状态,否则将发生错误。

此函数在成功时返回 true,否则返回 false 并根据套接字错误设置相应的错误。

注意

此函数应使用与传递给 joinMulticastGroup() 的相同参数调用。

leaveMulticastGroup(groupAddress, iface)
参数:
返回类型:

bool

这是一个重载函数。

在界面 iface 上离开由 groupAddress 指定的多播组。

注意

此函数应使用与传递给 joinMulticastGroup() 的相同参数调用。

multicastInterface()#
返回类型:

QNetworkInterface

返回用于多播数据报的传出接口。这对于IPv4套接字对应于IP_MULTICAST_IF套接字选项,对于IPv6套接字对应于IPV6_MULTICAST_IF套接字选项。如果没有先前设置接口,则此函数返回无效的QNetworkInterface。套接字必须处于BoundState状态,否则返回无效的QNetworkInterface

pendingDatagramSize()#
返回类型:

int

返回第一个待处理的UDP数据报的大小。如果没有数据报可用,该函数返回-1。

readDatagram(maxlen)#
参数:

maxlen – int

返回类型:

(数据,地址,端口)

接收不超过maxSize字节的数据报并将其存储在data中。发送者的主机地址和端口存储在*``address``和*``port``中(除非指针为None)。

如果成功,返回数据报的大小;否则返回-1。

如果maxSize太小,数据报的其余部分将丢失。为了避免数据丢失,在尝试读取之前,请调用pendingDatagramSize()以确定待处理数据报的大小。如果maxSize为0,则数据报将被丢弃。

receiveDatagram([maxSize=-1])#
参数:

maxSize – int

返回类型:

QNetworkDatagram

接收不超过maxSize字节的数据报,并将其存储在QNetworkDatagram对象中,同时包含发送者的主机地址和端口。如果可能,此函数还将尝试确定接收时数据报的目标地址、端口号和跳数。

在失败时,返回一个报告not validQNetworkDatagram

如果 maxSize 设置得太小,剩下的数据报将会丢失。如果 maxSize 为 0,则数据报将被丢弃。如果 maxSize 为 -1(默认值),此函数将尝试读取整个数据报。

setMulticastInterface(iface)#
参数:

ifaceQNetworkInterface

将多播数据报的输出接口设置为接口 iface。这对应于 IPv4 套接字的 IP_MULTICAST_IF 套接字选项和 IPv6 套接字的 IPV6_MULTICAST_IF 套接字选项。套接字必须是绑定状态,否则此函数将不执行任何操作。

writeDatagram(datagram, host, port)#
参数:
返回类型:

int

这是一个重载函数。

将数据报 datagram 发送到主机地址 hostport 通信端口。

如果成功,此函数返回发送的字节数;如果在遇到错误时,返回 -1。

writeDatagram(datagram)
参数:

datagramQNetworkDatagram

返回类型:

int

这是一个重载函数。

将数据报 datagram 发送到 datagram 中包含的主机地址和端口号,使用也在那里设置的计算机网络接口和跳数限制。如果未设置目标地址和端口号,此函数将发送到通过 connectToHost() 传递的地址。

如果目标地址是具有非空 scope id 的 IPv6 地址,但与 datagram 中的接口索引不同,则操作系统将选择哪个接口发送是未定义的。

如果成功,此函数返回发送的字节数;如果在遇到错误时,返回 -1。

警告

在已连接的 UDP 套接字上调用此函数可能会导致错误且不会发送任何数据包。如果您正在使用已连接的套接字,请使用 write() 发送数据报。