Как отправить несколько данных через 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 в зависимости от класса.

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

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

PD: Да, сервер и сокет успешно подключаются, Я В ЭТОМ УВЕРЕН :)

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

2

"Клиент: 21727090"

"Клиент: 20350202"

"Клиент: 123"

"Клиент:"

"Клиент:"

"Клиент:"


person joseluiselp    schedule 11.01.2014    source источник
comment
Что заставляет вас думать, что вы можете отправлять различные данные в сокет TCP одновременно? TCP основан на потоках, все происходит последовательно.   -  person SirDarius    schedule 12.01.2014
comment
Хм, этот язык adios-amigos делает его труднее для понимания, чем могло бы быть.   -  person lpapp    schedule 12.01.2014
comment
Что посоветуете SirDarius?   -  person joseluiselp    schedule 12.01.2014
comment
Это все еще не решено спустя год??   -  person lpapp    schedule 21.12.2014


Ответы (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());
}
person lpapp    schedule 12.01.2014
comment
Это не работает. Есть ли способ передать все атрибуты классов, когда сокет подключается к серверу? - person joseluiselp; 12.01.2014
comment
Когда я пытаюсь получить информацию на стороне клиента, система просто получает clientes и vuelos, reservacion нигде не появляется. Я думаю, это происходит потому, что при подключении сокета вся информация о классах записывается и отправляется через сокет. - person joseluiselp; 12.01.2014
comment
@ user3050498: ты разобрался в мельчайших подробностях? - person lpapp; 30.01.2014