【发布时间】:2022-08-18 20:33:25
【问题描述】:
对于在线游戏,我将多个客户端连接到服务器。消息的顺序对于遵守游戏逻辑至关重要。例如,要开始一个新游戏,我希望所有客户首先同意。
问题是我的消息通过了,但我没有以正确的顺序接收它(发送者也是接收者)。
class network : public QTcpSocket
void network::doSend(const MessageType msgType, QString msgReceiver, QString msgText) {
...
if( this->write( msgText.toUtf8() ) != msgText.toUtf8().length() )
qWarning() << \"Not all data have been sent\";
this->waitForBytesWritten(5000);
#ifdef QT_DEBUG
qDebug() << \"sent\" << QVariant::fromValue(msgType).toString() << \"from\" << m_sName;
#endif
}
void network::doReadyRead() {
...
case nwSyncNewGame: emit onSyncNewGame(aLastMessage); break;
...
#ifdef QT_DEBUG
qDebug() << \"received\" << aLastMessage[\"MessageType\"].toString() << \"from\" << aLastMessage[\"Sender\"].toString();
#endif
}
发送和接收的消息都在主线程中处理。喜欢:
QObject::connect(m_pNetwork, SIGNAL(onSyncNewGame(QVariantMap)),
this, SLOT(doNetworkSyncNewGame(QVariantMap)));
void GamePlay::syncNewGame(QVariantMap aConfig) {
m_pNetwork->doSend(network::nwPoll, \"group\", \"\");
...
m_pNetwork->doSend(network::nwSyncNewGame, \"group\", configData.join(\"\\a\"));
void GamePlay::doNetworkSyncNewGame(QVariantMap aMsg) {
emit applyConfig(aMsg);
emit newGame(aMsg[\"IsLoading\"].toBool());
}
从 \"Scotty\" 发送 \"nwPoll\" 从 \"Scotty\" 发送 \"nwSyncNewGame\" 从 \"Scotty\" 发送 \"nwAnswer\" 从 \"Scotty\" 收到 \"nwSyncNewGame\" 从 \"Scotty\" 收到 \"nwRefresh\" 收到来自 \"Scotty\" 的 \"nwPoll\"
我该去哪里寻找解决方案?
-
你能打印整个数据包,特别是时间戳吗?
-
* 从 \"Scotty\" 发送 1660546441960 \"nwPoll\" * 从 \"Scotty\" 发送 1660546441961 \"nwSyncNewGame\" * 从 \"Scotty\" 发送 1660546441994 \"nwAnswer\" * 收到 1660546442055 \"nwInformation\"来自 \"Server\" * 从 \"Scotty\" 收到 1660546442103 \"nwRefresh\" * 从 \"Scotty\" 收到 1660546442232 \"nwPoll\" (由于某种原因,在这种情况下并非所有消息都通过,我收到 nwSyncNewGame在任何其他消息之后。)github.com/Scrabble3D/4.0 的完整项目
标签: qt6