Я написал класс, который пишет в клиентский сокет. Это серверная нить. Он просто выталкивает 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? Я не хочу, чтобы сокет был отключен после выполнения записи, но без вызова клиент не может даже прочитать первый пакет. Я хочу, чтобы потоки ожидали данных все время, пока приложение работает.
Любой совет к коду?