Sziasztok!
A következő problémával szembesültem, amire nem sikerült megoldást találnom:
Van egy Qt-s szerveren és egy kliensem, melyek socketen keresztül kommunikálnak. Vannak olyan esetek, amikor a szerver egymás után több üzenetet küld egy kliensnek, tehát többször hívódik meg a QTcpSocket write metódusa. Ekkor csak az első üzenet jut el a klienshez. A waitForBytesWritten és a flush nem segített. A buffer kiürül, a write minden üzenet esetén annyival tér vissza, ahány byte az üzenet hossza, tehát elvileg elküldi, de a klienshez csak az első érkezik meg. Ami még érdekes: ha a kliens egy újabb kérést küld a szervernek, akkor a megfelelő válasz helyett az előzőleg elmaradt üzenetet fogadja a kliens, és az újabb üzenet várakozik valahol, és így tovább.
Találkozott már valaki hasonló problémával? Ha a QTcpSocket szerint üres a buffer, akkor hol tárolódhatnak még az elakadt üzenetek?
Kódrészlet:
Sever osztályban:
client->send("UZENET 1");
client->send("UZENET 2");
A send metódus:
void ClientThread::send(QString str)
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_3);
out << (quint16)0;
out << str;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
tcpSocket->write(block);
tcpSocket->waitForBytesWritten(-1);
}
Előre is köszönök minden választ!
- 983 megtekintés
Hozzászólások
tcpSocket->waitForBytesWritten(-1); - ez mit terit vissza?
Mutasd a kliens kodot!
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
- A hozzászóláshoz be kell jelentkezni
A waitForBytesWritten minden esetben true-val tér vissza.
A Client konstruktorában:
connect(this, SIGNAL(readyRead()), this, SLOT(recv()));
A recv:
void Client::recv()
{
QDataStream in(this);
in.setVersion(QDataStream::Qt_4_0);
if (blockSize == 0)
{
if (bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (bytesAvailable() < blockSize)
return;
in >> msg;
blockSize = 0;
workUpMsg(msg);
}
A workUpMsg értelmezi a kapott üzenetet.
- A hozzászóláshoz be kell jelentkezni
Nem ertek QT-hez, de szerintem beolvasaskor nem olvasod be a teljes uzenetet. En leellenoriznem azt a par return-ot a beolvasasakor (tobb return egy fuggvenyben kerulendo amugy!), es a kiiras a szerverben is gyanus!
Meg feldolgozni angolul process, es nem workUp! :^)
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
- A hozzászóláshoz be kell jelentkezni
Egy picit tört angolsággal ugyan, de itt van (magyarázat is, nem csak az h mit csinálj):
http://www.qtforum.org/article/26292/client-server-communication-lost-m…
Szerk.: Amúgy is javaslom a qtforumot, nekem többször is segítettek már.
- A hozzászóláshoz be kell jelentkezni
Igen, talalkoztam mar ilyennel. Vagy legalabbis hasonloval.
Bar en line-oriented protocols transfert hasznaltam a block-oriented helyett.
Mindenesetre ahogy eszrevettuk, anno egy Java-s szerver es egy Qt-s kliens kozott oly modon veszett el adat, hogy amikor a szerver 1-nel tobbszor kuldott uzenetet a kliensnek valaszra varas nelkul, akkor a kliensben a readyRead() egyszeruen csak 1x emittolodott, tobbszor nem.
A rapid megoldast egy oda-vissza (folyamatosan) kommunikalo protokoll jelentette. /Tehat mondjuk adott esetben egy egyszeru ack vagy pong. :) /
- A hozzászóláshoz be kell jelentkezni
Köszönöm a segítségeteket!
Sikerült megtalálni a megoldást, valóban az volt a probléma, hogy a kliens nem minden kapott üzenetet olvasott be.
- A hozzászóláshoz be kell jelentkezni