QT client to C server
-
Din pacate cunostintele mele de OOP sunt reduse, deci as vrea sa imi recomanzi cea mai simpla solutie. Am incercat sa derivez, dar nu mi-a mers.
Codul arata asa@class Footbal : public QDialog, public Login@
Primesc eroarea:'QObject' is an ambiguos base of 'Footbal' - de 4 ori. Si un warning:
Class Footbal inherits from two QObject subclasses QDialog and Login. This is not supported!public QDialog era pus inca din momentul in care am realizat interfata si am creat legaturile on_pushbutton_clicked.
-
Am scos-o la capat cu chestia asta. Acum stiu ca mesajele ajung de la client la server si de la server la client. Problema e urmatoarea: eu vreau sa transmit date destul de multe de la server la clienti, inclusiv \n-urile. Pentru a le afisa in client folosesc QMessagebox-uri. Nu am reusit sa primesc in client decat cate un singur rand. Intrebarea mea e: nu poate Messagebox-ul sa suporte randuri multiple? Sau cum pot transmite date mari de la server la client.
O portiune de cod in care incerc sa transmit date la client:
@ QByteArray Data = socket->readAll(); // citirea informatiei din socket;
qDebug() << socketDescriptor << "Data in: " << Data; // scrierea informatiei de la client
QString Data2;
Data2 = "\n1 Dinamo\n2 Steaua\n 3Vaslui\n";
socket->write(Data); //test, sa vad daca merge sa scriu inapoi ce am primit
socket->flush();
socket->write(Data2.toUtf8());
socket->flush();@Partea interesanta e ca de fiecare data cand apas butonul respectiv primesc doar pana la \n - apas odata, primesc 1 Dinamo, mai apas odata, primesc 2 Steaua etc.
-
bq. nu poate Messagebox-ul sa suporte randuri multiple?
QMessageBox suporta randuri multiple, dar nu aici cred ca este problema ta
Din cate vad trimiti de 2 ori aceleasi date, odata la linia 4 si odata la linia 7
La client ce primesti daca chemi
@
int receivedBytesSize = socket->readAll()->size();
@Ce valoare are "receivedBytesSize" ?
-
@if(pSocket->waitForConnected())
{
int recvBS = pSocket->readAll().size();
qDebug () << recvBS;
}@
Ciudat.
Cand apas prima oara pe butonul respectiv imi scrie 0. Dar daca apas iar imi da 28. Daca mai apas in continuare, tot 28. Deci 28 cred ca e marimea. Dar nu-s lamurit ce inseamna 0 ala intai. Nu as vrea sa am pierderi de dateCum pot face sa am mai mult spatiu? Vreau sa trimit chiar poate chiar si 2048 caractere
-
bq. Cand apas prima oara pe butonul respectiv imi scrie 0. Dar daca apas iar imi da 28.
Poti sa scrii exact ce trimiti de la server ?
Iar codul de mai sus pune-l intr-un slot connectat la readyRead signal emis de "pSocket"bq. Nu as vrea sa am pierderi de date
Nu o sa ai niciodata pierderi de date. TCP protocol tocmai asta este, garanteaza ca toate packets ajung la destinatie si in ordinea in care sunt trimise.
-
@void Thread::readyRead()
{
QByteArray Data = socket->readAll(); // citirea informatiei din socket;
qDebug() << socketDescriptor << "Data in: " << Data; // scrierea informatiei de la client
QString Data2;
Data2 = "\n1 Dinamo\n2 Steaua\n 3Vaslui\n";
socket->write(Data2.toUtf8());
socket->flush();
}@asta e functia din server.
Acum rezolv si cu readyRead-ul in client si postez imediat
-
bq. Am testat si primesc doar 28 in output.
... deci functioneaza bine acuma (din cate inteleg)
bq. In server o sa vreau sa citesc din fisier si sa trimit la client
Poti sa trimiti date la client citite de oriunde, de pe hdd, din alt socket, din memorie, etc ... poti sa creezi orice pachet de date