Как работает запись / чтение из сокета в pyqt5 Python? - PullRequest
0 голосов
/ 19 января 2020

Я написал класс, который пишет в клиентский сокет. Это серверная нить. Он просто выталкивает 2 одинаковых блока данных в сокет.

class PokerPlayerController(QThread):
login = ""
coins = 0
command = ""

def __init__(self, socketDescriptor, parent):
    QObject.__init__(self, parent)
    self.socketDescriptor = socketDescriptor

def run(self) -> None:
    socket = QTcpSocket()

    if not socket.setSocketDescriptor(self.socketDescriptor):
        print("error")
        return

    block = QByteArray()
    data = QDataStream(block, QIODevice.WriteOnly)
    data.setVersion(QDataStream.Qt_5_0)
    data.writeQString("elo")

    data.startTransaction()
    socket.write(block)
    socket.write(block)
    data.commitTransaction()

    socket.waitForDisconnected()

А затем существует поток на стороне клиента для получения данных:

class Maintenance(QThread):
error = pyqtSignal(str)

def __init__(self, login, coins):
    QThread.__init__(self)
    self.login = login
    self.coins = coins

    self.start()

def run(self) -> None:
    socket = QTcpSocket()
    socket.connectToHost("127.0.0.1", 5000)

    if not socket.waitForConnected(5000):
        self.error.emit(socket.error(), socket.errorString())
        return

    data = QDataStream(socket)
    data.setVersion(QDataStream.Qt_5_0)
    while True:
        while True:

            if not socket.waitForReadyRead(5000):
                print("error ready", socket.errorString())
                return

            data.startTransaction()
            fortune = data.readQString()

            if data.commitTransaction():
                break

        print(fortune)

Я взял шаблон из https://doc.qt.io/qtforpython/overviews/qtnetwork-threadedfortuneserver-example.html для сервера и https://doc.qt.io/qtforpython/overviews/qtnetwork-blockingfortuneclient-example.html#blocking -fortune-client-example для клиента.

Я сделал эти примеры немного проще (я думаю). Проблема в том, что когда я запускаю этот код, я могу получить только первый пакет, который я отправил клиенту, и вторая проблема заключается в том, нужно ли мне вызывать waitForDisconnected? Я не хочу, чтобы сокет был отключен после выполнения записи, но без вызова клиент не может даже прочитать первый пакет. Я хочу, чтобы потоки ожидали данных все время, пока приложение работает.

Любой совет к коду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...