Qt i QTcpSocket
-
Cześ!
Mam do Was bardzo ważne pytanie. Korzystam z QT by zaprogramować prosty serwer - chcę, żeby klient podane przeze mnie dwie liczby (x i y) wysłał jako dane do serwera, ten, żeby je dodał ze sobą i odesłał klientowi. Swój kod w większości oparłem na Threated Fortune Server i Fortune Client. Jednakże zamiast tamtej funkcji run, która jest w fortunethread.h dałem poniższą:
@...
void FortuneThread::run()
{
//emit msgSignal(QString::number(socketDescriptor));
readFromSocket();
}void FortuneThread::readFromSocket()
{
//QString numbers;QTcpSocket tcpSocket; if (!tcpSocket.setSocketDescriptor(socketDescriptor)) { emit error(tcpSocket.error()); return; } if(tcpSocket.isReadable()) //(1) { QDataStream in(&tcpSocket); in.setVersion(QDataStream::Qt_4_0); QString numbers; QByteArray arr; in >> arr; QString k (arr.data()); //ten sygnał wyświetla po prostu okienko dialogowe z komunikatem, który jest w parametrze emit msgSignal("Deskryptor: " + QString::number(socketDescriptor) + "\nDane: " + k); } else { emit msgSignal("asdfghjklasdfghjkl"); } tcpSocket.disconnectFromHost(); tcpSocket.waitForDisconnected();
}
...
@
a w kliencie staram się wysłać dane do serwera (po naciśnięciu przycisku getFortuneButton) w taki oto sposób:
@
void Client::writeToSocket(){
tcpSocket->connectToHost(hostLineEdit->text(), portLineEdit->text().toInt()); QString num = (x + " " + y); QByteArray tab = num.toAscii(); // QMessageBox b; // b.setText(x + " + " + y); // b.exec(); tcpSocket->write(tab); tcpSocket->disconnectFromHost(); tcpSocket->close();
}@
Pomimo, że soket w serwerze jest otwarty i wchodzi do ifa (1) to wyświetla mi numer deskryptora, ale wysłanych danych nie.
Czy mógłby mi ktoś poinstruować, dlaczergo to nie działa?Z góry dziękuję za pomoc
BTW, wszystko się kompiluje i w ogóle, tylko prawdopodobnie nie może się to połączyć. Nie do końca rozumiem działania QTcpSocket'ów i czy można je tak łączyć, jak "rurki z danymi", żeby był jakiś przepływ.
Jeszcze raz dzięki za pomoc :)
-
Popatrzyłem w dokumentację i w Fortune Server Example i na mój gust źle wysyłasz dane. Musisz odpowienio spreparować QByteArray przez wysłaniem. Popatrz w metodę:
@
void Server::sendFortune()
@i przeczytaj jeszcze raz omówienie przykłądu - zwróć uwagę że QByteArray jest obrabiane.
-
Trochę czasu minęło od zapytania, więc nie wiem czy jeszcze z tym walczysz, ale dodam tylko, że w paczce QByteArray pierwsze pole powinno zawierać długość blooku przesyłanych danych, bo nigdy nie wiadomo ize z nich pójdzie po sokecie za jednym razem. Na podstawie tej wartości albo kontynuujesz odczyt, albo zamykasz soket po odczycie całości. Tak w skrócie.