2

为什么在 PyQt5 QUdpSocket 中没有 writeDatagram() 而只有 write() 和 writeData()?

那么我怎样才能将数据发送到某个IP地址和端口呢?

4

1 回答 1

4

QUdpSocket 确实有这个writeDatagram()方法。

from PyQt5 import QtCore, QtNetwork


class Sender(QtCore.QObject):
    def __init__(self, parent=None):
        super(Sender, self).__init__(parent)
        self._socket = QtNetwork.QUdpSocket(self)

    @QtCore.pyqtSlot()
    def send_message(self):
        message = QtCore.QDateTime.currentDateTime().toString()
        datagram = message.encode()
        print("send message:", message)
        self._socket.writeDatagram(
            datagram, QtNetwork.QHostAddress("127.0.0.1"), 45454
        )


class Receiver(QtCore.QObject):
    def __init__(self, parent=None):
        super(Receiver, self).__init__(parent)
        self._socket = QtNetwork.QUdpSocket(self)
        self._socket.bind(QtNetwork.QHostAddress("127.0.0.1"), 45454)
        self._socket.readyRead.connect(self.on_readyRead)

    @QtCore.pyqtSlot()
    def on_readyRead(self):
        while self._socket.hasPendingDatagrams():
            datagram, host, port = self._socket.readDatagram(
                self._socket.pendingDatagramSize()
            )
            print("message from:", host.toString())
            print("message port:", port)
            print("message:", datagram.decode())


if __name__ == "__main__":
    import sys

    app = QtCore.QCoreApplication(sys.argv)
    receiver = Receiver()
    sender = Sender()
    timer = QtCore.QTimer(interval=1000, timeout=sender.send_message)
    timer.start()
    sys.exit(app.exec_())
于 2019-05-07T03:08:09.113 回答