QTcpSocket连接传入空数据问题
我正在尝试使用qtcpsocket连接在服务器和客户端之间发送数据。当我发送小尺寸数据时,一切正常。但当大小增加时,从tcpsocket读取的数据将变为空:( //启用连接QTcpSocket连接传入空数据问题,qt,Qt,我正在尝试使用qtcpsocket连接在服务器和客户端之间发送数据。当我发送小尺寸数据时,一切正常。但当大小增加时,从tcpsocket读取的数据将变为空:( //启用连接 bool ClientService::enableConnection() { qDebug() << Q_FUNC_INFO << "Invoked"; const int iTimeout = 5 * 1000; m_socket.connectToHost(settin
bool ClientService::enableConnection()
{
qDebug() << Q_FUNC_INFO << "Invoked";
const int iTimeout = 5 * 1000;
m_socket.connectToHost(settings.getServerIP(), PORT);
if (!m_socket.waitForConnected(iTimeout))
{
emit error();
qDebug() << Q_FUNC_INFO << m_socket.errorString();
return false;
}
qDebug() << Q_FUNC_INFO << "Exits";
return true;
}
boolclientservice::enableConnection()
{
qDebug()问题已解决。:)
从客户端传递到服务器的数据大小导致了该问题。因为当数据大小变得更大时,我使用了quint16,服务器无法知道确切的传入数据大小。因此,我将类型更改为quint32。问题得到了解决
outputStream << (quint32)0;
outputStream seek(0);
outputStream我建议使用QTcpSocket的readyRead信号让您知道数据何时可用,而不是在套接字上等待字节可用:您也可以调用flush()将数据写入socket@Merlin069:据我所知,每次新数据可用时都会发出readyRead。因此,我应该以正确的顺序读取整个数据。这是一个问题吗?是的,每次新数据可用时都会发出readyRead,但它可能只是数据的一部分,您需要将其连接到缓冲区中。一开始发送数据大小作为第一个字节是一种好的做法,然后您就知道对readyRead的连续调用的期望值。不,我的意思是我不能使用readyRead,因为我可能无法确定哪些数据已经出现。因为我正在发送不同类型的数据,如组{}、子组{}、项{}…使用readyRead对我来说很麻烦
bool ClientService::waitForServerResponse()
{
qDebug() << Q_FUNC_INFO << "Invoked";
const int iTimeout = 5 * 1000;
while (m_socket.bytesAvailable() < (int)sizeof(quint16))
{
if (!m_socket.waitForReadyRead(iTimeout))
{
emit error();
qDebug() << Q_FUNC_INFO << m_socket.errorString();
return false;
}
}
quint16 blockSize;
QDataStream inputStream(&m_socket);
inputStream.setVersion(QDataStream::Qt_4_0);
inputStream >> blockSize;
while (m_socket.bytesAvailable() < blockSize)
{
if (!m_socket.waitForReadyRead(iTimeout))
{
emit error();
qDebug() << Q_FUNC_INFO << m_socket.errorString();
return false;
}
}
qDebug() << Q_FUNC_INFO << "Exits";
return true;
}
void ClientService::disableConnection()
{
qDebug() << Q_FUNC_INFO << "Invoked";
m_socket.disconnectFromHost();
qDebug() << Q_FUNC_INFO << "Exits";
return;
}
int ClientService::syncMasters(SyncMaster syncMasterData)
{
qDebug() << Q_FUNC_INFO << "Invoked";
int syncStatus = -1;
if(enableConnection())
{
qDebug() << Q_FUNC_INFO << "connection enabled";
// typecast to ensure cross platform compatibility
const qint32 mode_int = static_cast<qint32>(SYNC_MASTERS_QUERY);
QByteArray block;
QDataStream outputStream(&block, QIODevice::WriteOnly);
outputStream.setVersion(QDataStream::Qt_4_0);
outputStream << (quint16)0;
outputStream << mode_int; // saying query mode to server
// group master data
outputStream << syncMasterData.groupMasterList.count();
qDebug() << Q_FUNC_INFO << "groupmaster count" <<
syncMasterData.groupMasterList.count();
foreach (GroupMaster groupMasterItem, syncMasterData.groupMasterList)
{
outputStream << groupMasterItem.groupCode;
outputStream << groupMasterItem.groupDescription;
outputStream << groupMasterItem.kotPrinterNo;
outputStream << groupMasterItem.image;
outputStream << groupMasterItem.sortId;
qDebug() << Q_FUNC_INFO <<
"code" << groupMasterItem.groupCode <<
"desc" << groupMasterItem.groupDescription <<
"kot " << groupMasterItem.kotPrinterNo <<
"image" << groupMasterItem.image <<
"sort id" << groupMasterItem.sortId;
}
// subgroup master data
outputStream << syncMasterData.subGroupMasterList.count();
qDebug() << Q_FUNC_INFO << "subgroupmaster count" <<
syncMasterData.subGroupMasterList.count();
foreach (SubGroupMaster subGroupMasterItem,
syncMasterData.subGroupMasterList)
{
outputStream << subGroupMasterItem.groupCode;
outputStream << subGroupMasterItem.subGroupCode;
outputStream << subGroupMasterItem.subGroupDescription;
qDebug() << Q_FUNC_INFO <<
"gpcode" << subGroupMasterItem.groupCode <<
"subgpcode" << subGroupMasterItem.subGroupCode <<
"desc" << subGroupMasterItem.subGroupDescription;
}
// item master data
outputStream << syncMasterData.itemMasterList.count();
qDebug() << Q_FUNC_INFO << "item master count" <<
syncMasterData.itemMasterList.count();
foreach (ItemMaster ItemMasterItem, syncMasterData.itemMasterList)
{
outputStream << ItemMasterItem.itemCode;
outputStream << ItemMasterItem.itemName;
outputStream << ItemMasterItem.groupCode;
outputStream << ItemMasterItem.subGroupCode;
outputStream << ItemMasterItem.imagePath;
outputStream << ItemMasterItem.productId;
outputStream << ItemMasterItem.itemPriceType;
outputStream << ItemMasterItem.itemPrice;
outputStream << ItemMasterItem.kotPrinterNumber;
outputStream << ItemMasterItem.sortId;
qDebug() << Q_FUNC_INFO <<
"item code" << ItemMasterItem.itemCode <<
"item name" << ItemMasterItem.itemName <<
"group code" << ItemMasterItem.groupCode <<
"subgp code" << ItemMasterItem.subGroupCode <<
"image path" << ItemMasterItem.imagePath <<
"product id" << ItemMasterItem.productId <<
"item pricetype"<< ItemMasterItem.itemPriceType <<
"item price" << ItemMasterItem.itemPrice <<
"kot" << ItemMasterItem.kotPrinterNumber<<
"sortId" << ItemMasterItem.sortId;
}
// side item master data
outputStream << syncMasterData.sideItemMasterList.count();
qDebug() << Q_FUNC_INFO << "side item master count" <<
syncMasterData.sideItemMasterList.count();
foreach (SideItemMaster sideItemMasterItem,
syncMasterData.sideItemMasterList)
{
outputStream << sideItemMasterItem.itemCode;
outputStream << sideItemMasterItem.sideItemCode;
outputStream << sideItemMasterItem.lineNumber;
outputStream << sideItemMasterItem.sideItemPrice;
outputStream << sideItemMasterItem.sideItemPriceType;
qDebug() << Q_FUNC_INFO <<
"item code" << sideItemMasterItem.itemCode <<
"sideitem code" << sideItemMasterItem.sideItemCode <<
"line no" << sideItemMasterItem.lineNumber <<
"sideitem pric" << sideItemMasterItem.sideItemPrice <<
"siditm prc typ"<< sideItemMasterItem.sideItemPriceType;
}
// price master data
outputStream << syncMasterData.priceMasterList.count();
qDebug() << Q_FUNC_INFO << "price master count" <<
syncMasterData.priceMasterList.count();
foreach (PriceMaster priceMasterItem, syncMasterData.priceMasterList)
{
outputStream << priceMasterItem.itemCode;
outputStream << priceMasterItem.itemPriceType;
outputStream << priceMasterItem.promoCode;
outputStream << priceMasterItem.validFromDate;
outputStream << priceMasterItem.validToDate;
outputStream << priceMasterItem.validFromTime;
outputStream << priceMasterItem.validToTime;
outputStream << priceMasterItem.unitCode;
outputStream << priceMasterItem.itemPrice;
outputStream << priceMasterItem.specialPrice;
outputStream << priceMasterItem.unitDescription;
qDebug() << Q_FUNC_INFO <<
"item code" << priceMasterItem.itemCode <<
"itm prc typ" << priceMasterItem.itemPriceType <<
"promo code" << priceMasterItem.promoCode <<
"validfrmdt" << priceMasterItem.validFromDate <<
"vld to dt" << priceMasterItem.validToDate <<
"vld frm tm" << priceMasterItem.validFromTime <<
"vld to tm" << priceMasterItem.validToTime <<
"unit code" << priceMasterItem.unitCode <<
"item price" << priceMasterItem.itemPrice <<
"spcl price" << priceMasterItem.specialPrice <<
"unit desc" << priceMasterItem.unitDescription;
}
outputStream.device()->seek(0);
outputStream << (quint16)(block.size() - sizeof(quint16));
if(sendToServer(block))
{
qDebug() << Q_FUNC_INFO << "query sent to server successfully";
if (waitForServerResponse())
{
qDebug() << Q_FUNC_INFO << "read set status from server";
QDataStream inputStream(&m_socket);
inputStream.setVersion(QDataStream::Qt_4_0);
inputStream >> syncStatus;
}
}
disableConnection();
}
qDebug() << Q_FUNC_INFO << "Exits" << syncStatus;
return syncStatus;
}
void ServerFunctionThread::syncMasters()
{
qDebug() << Q_FUNC_INFO << "Invoked";
SyncMaster syncMasterData;
int groupCount = 0,
subGroupCount = 0,
itemCount = 0,
sideItemCount = 0,
priceCount = 0;
QDataStream inputStream(&tcpSocket);
inputStream.setVersion(QDataStream::Qt_4_0);
// group master data reception
inputStream >> groupCount;
qDebug() << Q_FUNC_INFO << "group master Count" << groupCount;
while (groupCount--)
{
GroupMaster groupMasterItem;
inputStream >> groupMasterItem.groupCode;
inputStream >> groupMasterItem.groupDescription;
inputStream >> groupMasterItem.kotPrinterNo;
inputStream >> groupMasterItem.image;
inputStream >> groupMasterItem.sortId;
syncMasterData.groupMasterList.append(groupMasterItem);
qDebug() << Q_FUNC_INFO <<
"code" << groupMasterItem.groupCode <<
"desc" << groupMasterItem.groupDescription <<
"kot " << groupMasterItem.kotPrinterNo <<
"image" << groupMasterItem.image <<
"sort id" << groupMasterItem.sortId;
}
.
.
...
outputStream << (quint32)0;
outputStream.device()->seek(0);
outputStream << (quint32)(block.size() - sizeof(quint32));