Как отправить несколько информационных сообщений QTcpSocket одновременно?

Я делаю небольшое приложение для резервирования клиент / сервер, и я застрял на том, как я могу отправить информацию о классах, На самом деле у меня есть 3 класса, и я отправляю информацию следующим образом:

VentanaPrincipalS::VentanaPrincipalS(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::VentanaPrincipalS)
{
  //..Methods..//
  connect(conexion,SIGNAL(nuevaConexion(QTcpSocket*)), this, SLOT(enviarDataCliente(QTcpSocket*)));
  connect(conexion,SIGNAL(nuevaConexion(QTcpSocket*)), this, SLOT(enviarDataVuelo(QTcpSocket*)));
  connect(conexion,SIGNAL(nuevaConexion(QTcpSocket*)), this, SLOT(enviarDataReservacion(QTcpSocket*)));
   //..Methods..//
}
void VentanaPrincipalS::enviarDataVuelo(QTcpSocket *sock)
{
  QByteArray buffer;
  QDataStream out(&buffer, QIODevice::ReadWrite);
  out << 1;
  for(int i = 0; i < empresa.cantidadVuelos(); i++){
      out << empresa.getVuelos().at(i)->getDestino() << empresa.getVuelos().at(i)->getIdVuelo() << empresa.getVuelos().at(i)->getPartida();
  }
  if(sock->isValid())
  {
    sock->write(buffer);
  }

}
//2 More methods just like this, switching the out first number
to know which class is...//

На стороне клиента я получаю так:

in>> caracterControl;
    switch(caracterControl){
    case 1:{
        while(!in.atEnd()){
            QString destino;
            QString id;
            QDate fecha;
            in >> destino >> id >> fecha;
            qDebug()<< destino +" "+ id + " " + fecha.toString();
            MVuelo vuelop(id, destino, fecha);
            listaVuelos.append(id);
            vuelosRecibidos.push_back(vuelop);
        }
     }
     case 2:{
        while(!in.atEnd()){
            QString cedula;
            QString correo;
            QString nombre;
            QString telf;
            in >> cedula >> correo >> nombre >> telf;
            MCliente cliente(nombre, cedula, telf, correo);
            qDebug()<< "Cliente: " + cedula;
        }
     }
    case 3:{
       while(!in.atEnd()){
           QString reserva;
           QString vuelo;
           in >> reserva >> vuelo;
           qDebug()<< "Reserva: " + reserva;
       }
    }

}

1, 2 или 3, в зависимости от класса.

Проблема в том, что информация неполна и точно так же, как сокет падает, потому что другой метод пишет на нем, есть ли способ получить всю информацию по порядку или способ сообщить серверу, что сокет завершил чтение?

Пожалуйста, помогите мне;(...

П.Д.: Да, сервер и сокет успешно соединяются. Я уверен, что:)

ПРИМЕЧАНИЕ: у меня есть QList с 3 клиентами (21727090, 20350202 и 123), и я получаю это через qDebug ()

2

"Клиент: 21727090"

"Клиент: 20350202"

"Клиент: 123"

"Клиент":

"Клиент":

"Клиент":

1 ответ

Проблема в том, что информация неполна и точно так же, как сокет падает, потому что другой метод пишет на нем, есть ли способ получить всю информацию по порядку или способ сообщить серверу, что сокет завершил чтение?

Самый быстрый обходной путь - это поместить блокирующее (то есть синхронизирующее) ожидание после записи следующим образом:

if (sock->isValid())
{
    sock->write(buffer);
    if (!sock->waitForBytesWritten(5000))
        qDebug() << QString("Operation timed out or an error occurred for sock, error: %1).arg(sock->errorString());
}
Другие вопросы по тегам