【问题标题】:QTcpSocket doesn't receive all dataQTcpSocket 不接收所有数据
【发布时间】:2013-09-09 12:50:34
【问题描述】:

大家好,我做了一个服务器和一个客户端,在 loaclHost 中,这个程序运行良好,但是当我将 localHost 更改为我的 ip 时,客户端不再接收所有数据,所以我决定重写代码。这是我的新代码的一部分:

       void fenPrincipal::test()
      {

qDebug()<<tailleContenu<<"taille Contenu 1";
QDataStream in(actualSocket);
  if (tailleContenu == 0) 
{             
if (actualSocket->bytesAvailable() < (int)sizeof(quint64)) 
               return;

          in >> tailleContenu; 
          qDebug()<<tailleContenu<<"taille Contenu";
  }


  a =  actualSocket->bytesAvailable();
  qDebug()<<actualSocket->bytesAvailable()<<"byte available";

   if ( a <  tailleContenu) 
   {
       return;
   }
   else if (a>tailleContenu){
   QString messageRecue;
   in >> messageRecue;
   qDebug()<<messageRecue<<"message";
tailleContenu=0;

   }
}

这里是调试信息:

  1448 byte available 
  "Dragon Age: Inquisition -Du gameplay, des images et des détails" titre <- it's the second information send by the server
    0 taille Contenu 1 
   2812 taille Contenu 
   1310 byte available 
   2812 taille Contenu 1 
   1460 byte available 
   2812 taille Contenu 1 
   2920 byte available 
   "" message
   0 taille Contenu 1 
   30962754250670195 taille Contenu 
   1452 byte available 
   30962754250670195 taille Contenu 1 
   2912 byte available 
   30962754250670195 taille Contenu 1 
   4372 byte available 
   30962754250670195 taille Contenu 1 
   5832 byte available 
   30962754250670195 taille Contenu 1 
   6806 byte available 

有人可以帮助告诉我为什么它不工作以及如何让我的客户工作?

【问题讨论】:

  • 我认为,您的 IP 地址无效。检查ipconfig并确认。如果无效,请继续使用 localhost/127.0.0.1。还请提供更多信息来改进您的示例代码。
  • 这不是ip问题,客户端有登录页面,所以如果客户端找不到服务器,客户端将停留在登录页面,服务器向客户端发送4个信息,第一个是消息的类型(例如:聊天消息或新闻消息),第二个是新的标题(一个 QString),第三个是新闻的内容(一个 QString),最后一个是源(一个 QString),客户端服务器接收到第 2 条信息,但没有收到第 3 条信息(长文本)
  • 写完第2个标题后,通过server->waitForBytesWritten(4000)延迟设置Server,然后server->write(data);
  • 您的解决方案一半有效,客户端接收所有数据,但是当我尝试使用过度内容(长文本,数据包)时,它不再起作用了

标签: qt tcp client-server qtcpsocket


【解决方案1】:

使用 tcp 连接,在提交消息之前,您永远无法知道发送了多少包。但是你可以让 Qt 处理这些东西。你需要实现这样的东西:

connect( m_pTcpServer, SIGNAL( newConnection()), SLOT( solt_newConnection()) );

void CTcpManager::solt_newConnection() {
  m_pTcpSocket = m_pTcpServer->nextPendingConnection();
  connect( m_pTcpSocket, SIGNAL(readyRead()), this, SLOT( slot_startRead() ) );
}

void CTcpManager::slot_startRead() {
  QByteArray grDatagram;
  grDatagram = m_pTcpSocket->readAll();

  // Process data

  m_pTcpSocket->close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多