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.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.