- class QUdpSocket#
QUdpSocket
类提供了 UDP 套接字。 更多...摘要#
方法#
注意
此文档可能包含从C++自动翻译到Python的片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译有问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建工单的方式来通知我们。
详细描述#
警告
本节包含从C++自动翻译到Python的片段,可能存在错误。
UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。在可靠性不重要的情况下可以使用。
QUdpSocket
是QAbstractSocket
的一个子类,允许您发送和接收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()
控制组成员身份,使用MulticastTtlOption
和MulticastLoopbackOption
设置 TTL 和回环套接字选项。使用setMulticastInterface()
控制组播数据报的输出接口,并使用multicastInterface()
查询它。使用
QUdpSocket
,您还可以通过connectToHost()
建立与 UDP 服务器的虚拟连接,然后使用 read() 和 write() 交换数据包,无需为每个数据包指定接收器。广播发送器、广播接收器、多播发送器 和 多播接收器 示例说明了如何在应用程序中使用
QUdpSocket
。创建一个
QUdpSocket
对象。parent
传递给 QObject 构造函数。参阅
- bind(addr[, port=0[, mode=QAbstractSocket.BindFlag.DefaultForPlatform]])#
- 参数:
addr –
SpecialAddress
port – int
mode –
BindFlag
组合
- 返回类型:
bool
- hasPendingDatagrams()#
- 返回类型:
bool
如果至少有一个数据包等待读取,则返回
true
;否则返回false
。- joinMulticastGroup(groupAddress)#
- 参数:
groupAddress –
QHostAddress
- 返回类型:
bool
使用系统默认接口将groupAddress所指定的多播组加入。套接字必须处于BoundState状态,否则将发生错误。
注意,如果您试图加入IPv4组,您的套接字不能使用IPv6(或在双模式下,使用
Any
) 进行绑定。您必须使用AnyIPv4
。此函数在成功时返回
true
,否则返回false
并根据套接字错误设置相应的错误。- joinMulticastGroup(groupAddress, iface)
- 参数:
groupAddress –
QHostAddress
iface –
QNetworkInterface
- 返回类型:
bool
这是一个重载函数。
在界面
iface
上加入多播组地址groupAddress
。- leaveMulticastGroup(groupAddress)#
- 参数:
groupAddress –
QHostAddress
- 返回类型:
bool
在使用操作系统选择的默认接口上离开由
groupAddress
指定的多播组。套接字必须处于BoundState状态,否则将发生错误。此函数在成功时返回
true
,否则返回false
并根据套接字错误设置相应的错误。- leaveMulticastGroup(groupAddress, iface)
- 参数:
groupAddress –
QHostAddress
iface –
QNetworkInterface
- 返回类型:
bool
这是一个重载函数。
在界面
iface
上离开由groupAddress
指定的多播组。- multicastInterface()#
- 返回类型:
返回用于多播数据报的传出接口。这对于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
- 返回类型:
接收不超过
maxSize
字节的数据报,并将其存储在QNetworkDatagram
对象中,同时包含发送者的主机地址和端口。如果可能,此函数还将尝试确定接收时数据报的目标地址、端口号和跳数。在失败时,返回一个报告
not valid
的QNetworkDatagram
。如果
maxSize
设置得太小,剩下的数据报将会丢失。如果maxSize
为 0,则数据报将被丢弃。如果maxSize
为 -1(默认值),此函数将尝试读取整个数据报。- setMulticastInterface(iface)#
- 参数:
iface –
QNetworkInterface
将多播数据报的输出接口设置为接口
iface
。这对应于 IPv4 套接字的 IP_MULTICAST_IF 套接字选项和 IPv6 套接字的 IPV6_MULTICAST_IF 套接字选项。套接字必须是绑定状态,否则此函数将不执行任何操作。- writeDatagram(datagram, host, port)#
- 参数:
datagram –
QByteArray
host –
QHostAddress
port – int
- 返回类型:
int
这是一个重载函数。
将数据报
datagram
发送到主机地址host
的port
通信端口。如果成功,此函数返回发送的字节数;如果在遇到错误时,返回 -1。
- writeDatagram(datagram)
- 参数:
datagram –
QNetworkDatagram
- 返回类型:
int
这是一个重载函数。
将数据报
datagram
发送到datagram
中包含的主机地址和端口号,使用也在那里设置的计算机网络接口和跳数限制。如果未设置目标地址和端口号,此函数将发送到通过connectToHost()
传递的地址。如果目标地址是具有非空
scope id
的 IPv6 地址,但与datagram
中的接口索引不同,则操作系统将选择哪个接口发送是未定义的。如果成功,此函数返回发送的字节数;如果在遇到错误时,返回 -1。
警告
在已连接的 UDP 套接字上调用此函数可能会导致错误且不会发送任何数据包。如果您正在使用已连接的套接字,请使用
write()
发送数据报。