[英]How to send multiple information trought QTcpSocket at the same time?
即時通訊正在做一個小的客戶端/服務器預訂應用程序,即時通訊卡住了我如何發送類的信息,實際上我有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個客戶端(21727090、20350202和123)的QList,並且即時消息接收此槽qDebug()
2
“客戶:21727090”
“客戶:20350202”
“客戶:123”
“客戶:”
“客戶:”
“客戶:”
問題在於信息不完整,就像套接字崩潰是因為另一種方法正在他身上寫消息一樣,是否有辦法按順序接收所有信息,還是有辦法告訴服務器套接字已完成讀取?
最快的解決方法是在寫入后在其中放置一個阻塞(即同步)等待,如下所示:
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());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.