• 7482阅读
  • 0回复

if(tcpSocket->bytesAvailable()<blockSize) return;in>> blockSize; [复制链接]

上一主题 下一主题
离线413419650
 
只看楼主 倒序阅读 楼主  发表于: 2010-12-09

写了两个小程序一个使用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));




快速回复
限100 字节
 
上一个 下一个