Qt Socket 不等待写入的字节
Qt Socket not waiting for bytes written
我写了一个国际象棋client/server手机应用程序,有一个远程服务器,已经在西海岸、东海岸、中间等地测试过。程序简而言之是这样的:
1. Log in to remote server with correct username/password via iOS/Android or Windows desktop.
2. Enter queue for a 1-minute, 5-minute or 30-minute game of chess.
3. Wait for another opponent to join queue.
4. Get matched and play game of chess.
5. When game is over, log out or play more chess.
但是,当我通过学校的互联网登录服务器时,我遇到了最奇怪的错误。这太奇怪了,因为它是我连接的众多 ISP 中唯一有问题的 ISP。
当我通过学校的互联网登录服务器时,我将从我的套接字中收到以下错误和错误字符串。
QAbstractSocket::UnknownSocketError "Unknown error"
在我的应用程序中生成这个的步骤是:
1. Enter username and password, log into server. (Successfully completes this).
2. Click to join a queue for a game of chess. (Successfully writes to socket, but fails to wait for bytes written then emits the above error and error string.
我检查了服务器,甚至没有调用 readyRead(),所以我知道客户端没有向服务器发送任何内容。
有趣的是,我找到了解决此错误的解决方法。
1. Click on Settings page.
2. Click Save. (Does the exact same thing as I try to do above. Write to socket, flush and wait for bytes written).
3. Join queue (Successfully joins queue).
解决方法毫无意义,因为它与我在上面尝试做的事情没有任何不同(写入套接字、刷新并等待写入的字节)。
有人知道可能发生的事情吗?
- 为什么此错误特定于一个互联网位置?我学校的网速很慢,但是没有解释为什么在下面的函数中套接字会立即断开连接。
- 为什么我的解决方法有效?
- 我该怎么做才能更多地了解我的问题(即愚蠢的错误消息..."unknown error")。
- 不仅如此,当我右击下面的函数,然后点击'Find usages'时,build文件夹出现了。这是程序中唯一执行此操作的函数。什么鬼???
套接字在此函数中断开连接。
void CG_serverConnection::sendQueueType(int timeControl)
{
//Create local JSON object
QJsonObject userInfo;
//Create object
userInfo["PacketHeader"] = QUEUE_REQUEST;
userInfo["TimeControl"] = timeControl;
//Create JSON document
QJsonDocument doc;
doc.setObject(userInfo);
qDebug() << "Send queue type called! ";
qDebug() << doc.toJson();
QByteArray byteArray = doc.toBinaryData();
//Send over socket
if(m_socket->write(byteArray))
{
qDebug() << "Wrote to socket";
}
else
m_socket->errorString();
if(m_socket->flush())
{
qDebug() << "Flushed";
}
else
qDebug() << m_socket->errorString();
if(m_socket->waitForBytesWritten(50000))
{
qDebug() << "Bytes were written.";
}
else
{
qDebug() << m_socket->error();
qDebug() << m_socket->errorString();
}
}
我调用函数的地方
Button
{
id: btn_oneMinuteGame
text: "One Minute"
style: cgButtonStyle
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: Lobby.getControlWidth()
Layout.preferredHeight: Lobby.getControlHeight()
onClicked:
{
ServerConnection.sendQueueType(1) // TODO : Magic numbers
root.startOneMinuteGame()
}
}
出于某种原因,如果我在我的函数顶部调用它,一切正常...
没有意义。如果有人能解释为什么这样做或者你有其他解决方案,请 post 它。
//Temporary bug fix
this->sendUpdatedUserInfo();
我称之为以某种方式使一切正常的功能
void CG_serverConnection::sendUpdatedUserInfo()
{
QJsonObject request;
request["PacketHeader"] = UPDATE_INFO;
request["loggedIn"] = m_player.loggedIn;
request["banned"] = m_player.banned;
request["username"] = m_player.username;
request["elo"] = m_player.elo;
request["countryFlag"] = m_player.countryFlag;
request["pieceSet"] = m_player.pieceSet;
request["language"] = m_player.language;
request["sound"] = m_player.sound;
request["coordinates"] = m_player.coordinates;
request["arrows"] = m_player.arrows;
request["autoPromote"] = m_player.autoPromote;
request["boardTheme"] = m_player.boardTheme;
QJsonDocument doc;
doc.setObject(request);
qDebug() << "Updated userInfo being sent: ";
qDebug() << doc.toJson();
m_socket->write(doc.toBinaryData());
m_socket->flush();
m_socket->waitForBytesWritten();
}
我写了一个国际象棋client/server手机应用程序,有一个远程服务器,已经在西海岸、东海岸、中间等地测试过。程序简而言之是这样的:
1. Log in to remote server with correct username/password via iOS/Android or Windows desktop.
2. Enter queue for a 1-minute, 5-minute or 30-minute game of chess.
3. Wait for another opponent to join queue.
4. Get matched and play game of chess.
5. When game is over, log out or play more chess.
但是,当我通过学校的互联网登录服务器时,我遇到了最奇怪的错误。这太奇怪了,因为它是我连接的众多 ISP 中唯一有问题的 ISP。
当我通过学校的互联网登录服务器时,我将从我的套接字中收到以下错误和错误字符串。
QAbstractSocket::UnknownSocketError "Unknown error"
在我的应用程序中生成这个的步骤是:
1. Enter username and password, log into server. (Successfully completes this).
2. Click to join a queue for a game of chess. (Successfully writes to socket, but fails to wait for bytes written then emits the above error and error string.
我检查了服务器,甚至没有调用 readyRead(),所以我知道客户端没有向服务器发送任何内容。
有趣的是,我找到了解决此错误的解决方法。
1. Click on Settings page.
2. Click Save. (Does the exact same thing as I try to do above. Write to socket, flush and wait for bytes written).
3. Join queue (Successfully joins queue).
解决方法毫无意义,因为它与我在上面尝试做的事情没有任何不同(写入套接字、刷新并等待写入的字节)。
有人知道可能发生的事情吗?
- 为什么此错误特定于一个互联网位置?我学校的网速很慢,但是没有解释为什么在下面的函数中套接字会立即断开连接。
- 为什么我的解决方法有效?
- 我该怎么做才能更多地了解我的问题(即愚蠢的错误消息..."unknown error")。
- 不仅如此,当我右击下面的函数,然后点击'Find usages'时,build文件夹出现了。这是程序中唯一执行此操作的函数。什么鬼???
套接字在此函数中断开连接。
void CG_serverConnection::sendQueueType(int timeControl)
{
//Create local JSON object
QJsonObject userInfo;
//Create object
userInfo["PacketHeader"] = QUEUE_REQUEST;
userInfo["TimeControl"] = timeControl;
//Create JSON document
QJsonDocument doc;
doc.setObject(userInfo);
qDebug() << "Send queue type called! ";
qDebug() << doc.toJson();
QByteArray byteArray = doc.toBinaryData();
//Send over socket
if(m_socket->write(byteArray))
{
qDebug() << "Wrote to socket";
}
else
m_socket->errorString();
if(m_socket->flush())
{
qDebug() << "Flushed";
}
else
qDebug() << m_socket->errorString();
if(m_socket->waitForBytesWritten(50000))
{
qDebug() << "Bytes were written.";
}
else
{
qDebug() << m_socket->error();
qDebug() << m_socket->errorString();
}
}
我调用函数的地方
Button
{
id: btn_oneMinuteGame
text: "One Minute"
style: cgButtonStyle
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: Lobby.getControlWidth()
Layout.preferredHeight: Lobby.getControlHeight()
onClicked:
{
ServerConnection.sendQueueType(1) // TODO : Magic numbers
root.startOneMinuteGame()
}
}
出于某种原因,如果我在我的函数顶部调用它,一切正常...
没有意义。如果有人能解释为什么这样做或者你有其他解决方案,请 post 它。
//Temporary bug fix
this->sendUpdatedUserInfo();
我称之为以某种方式使一切正常的功能
void CG_serverConnection::sendUpdatedUserInfo()
{
QJsonObject request;
request["PacketHeader"] = UPDATE_INFO;
request["loggedIn"] = m_player.loggedIn;
request["banned"] = m_player.banned;
request["username"] = m_player.username;
request["elo"] = m_player.elo;
request["countryFlag"] = m_player.countryFlag;
request["pieceSet"] = m_player.pieceSet;
request["language"] = m_player.language;
request["sound"] = m_player.sound;
request["coordinates"] = m_player.coordinates;
request["arrows"] = m_player.arrows;
request["autoPromote"] = m_player.autoPromote;
request["boardTheme"] = m_player.boardTheme;
QJsonDocument doc;
doc.setObject(request);
qDebug() << "Updated userInfo being sent: ";
qDebug() << doc.toJson();
m_socket->write(doc.toBinaryData());
m_socket->flush();
m_socket->waitForBytesWritten();
}