不显示删除回复显示所有回复显示星级回复显示得分回复 if(tcpSocket->bytesAvailable()

wingW00 2010-12-09 09:02:40
写了两个小程序一个使用tcpserver作服务器端,一个使用tcpsocket作为客户端,然后模拟一个填写登录后得到返回值的过程,客户端连接后发送两条字符串到服务器端,这个没有问题,然后服务器端根据它们发回数据,但客户端却没接受到,在客户端中间qDebug输出了一下tcpSocket->bytesAvailable(),发现返回6是正常的,但是blockSize就有问题(见下面代码),in>> blockSize,这句始终就把blockSize赋值为0,后面的in>>也都不对,检查了in.status()都是正常的,哪位大虾看看
到底哪里有问题。
下面是代码:
小程序客户端,首先连接server端,建立插座后写数据,然后等待服务器发回的数据然后检测返回的数据
tcpSocket->abort();
tcpSocket->connectToHost(address,port.toInt());

QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
LoginData loginData;
loginData.usrName=lineEdit->text();
loginData.password=lineEdit->text();
//流out用来向block中写入数据
out << (quint16)0;
out << loginData.usrName<<loginData.password;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
//先预留出要写入的数据长度,写入数据后,回到前部填充上信息的长度
tcpSocket->write(block);
//向插座中写入数据

//等待插座中传回数据
if (!tcpSocket->waitForReadyRead()) {
qDebug ("error! no data can be accepted!");
return;
}

QDataStream in(tcpSocket);
qint16 blockSize=0;
//检查长度
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16)) {
return;
}
------>这里就有问题 in>> blockSize;

QByteArray arr;
///检查blockSize 的值
arr=QString("The size: %1").arg(tcpSocket->bytesAvailable()).toLatin1();
const char *str=arr.data();
qDebug(str);

}

if (tcpSocket->bytesAvailable() < blockSize) {
return;
}

///////////////////////////////////////////

QString isPassed("-1");
in >> isPassed;
//检查server返回值
if (isPassed==tr("1")) {
label->setText(QString("correctly passed"));
} else if (isPassed==tr("0")){
label->setText(QString("not passed"));
tcpSocket->disconnectFromHost();
} else {
label->setText(QString("error request"));
tcpSocket->disconnectFromHost();
}

服务器端:
在得到新的连接时执行下段代码,接受客户端的数据然后根据数据判断该发送回什么值
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));

QDataStream in(clientConnection);
//从clientConnect中读取字符串
in.setVersion(QDataStream::Qt_4_0);
qint16 blockSize=0;
if (blockSize == 0) {
if (clientConnection->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}

if (clientConnection->bytesAvailable() < blockSize)
return;

LoginData loginData;
in >> loginData.usrName>>loginData.password;



QByteArray sendBlock;
QDataStream out(&sendBlock,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
if (loginData.password==QString ("123")) {
out << (quint16)0;
out <<tr("1");
out.device()->seek(0);
out <<qint16(sendBlock.size())-sizeof (qint16);
QByteArray arr;
clientConnection->write(sendBlock);
qDebug ("passed 1 to the socket");
}else {
out << (quint16)0;
out <<tr("0");
out.device()->seek(0);
out <<qint16(sendBlock.size())-sizeof (qint16);
clientConnection->write(sendBlock);
qDebug("passed 0 to the client");
clientConnection->disconnectFromHost();
}

line->setText (QString (loginData.password));
...全文
72 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧