Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Polish
  4. Qt i QTcpSocket
Forum Updated to NodeBB v4.3 + New Features

Qt i QTcpSocket

Scheduled Pinned Locked Moved Polish
3 Posts 3 Posters 2.2k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    boroowa
    wrote on last edited by
    #1

    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 :)

    1 Reply Last reply
    0
    • H Offline
      H Offline
      Hostel
      wrote on last edited by
      #2

      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.

      1 Reply Last reply
      0
      • A Offline
        A Offline
        akrynski
        wrote on last edited by
        #3

        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.

        --
        Pozdrawiam i do następnego...
        Greetings and till next...

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved