我正在做一个小型的客户端/服务器预订应用程序,我坚持我如何发送类的信息,实际上我有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:是的,服务器和套接字连接成功即时确认:)
注意:我有一个包含3个客户的QList(21727090,20350202和123),我正在接收这个低谷qDebug()
2
“Cliente:21727090”
“Cliente:20350202”
“Cliente:123”
“Cliente:”
“Cliente:”
“Cliente:”
答案 0 :(得分:0)
问题是信息是不完整的,就像套接字崩溃一样,因为另一种方法是写在他身上,是否有办法按顺序接收所有信息或告诉服务器套接字完成读取?
最快的解决方法是在写入后将阻塞(即同步)等待放在那里:
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());
}