2011-10-27 11 views
14

Jestem nowy w QT .. Chciałbym połączyć się z serwerem nasłuchującym i przesłać niektóre dane. Spojrzałem na dostępnych przykładów ale wydają się mieć dodatkowe funkcje, które nie wydają się bardzo pomocne dla mnie (połączyć, fortunę itp ..)Najprostszy klient QT TCP

QTcpSocket t; 
t.connectToHost("127.0.0.1", 9000); 

Zakładając, że serwer nasłuchuje i wytrzymałe .. Co robić Muszę wysłać QByteArray ze zmiennej "data".

Bardzo doceniane.

Odpowiedz

20

bardzo proste z QTcpSocket. Rozpocząć jak ty ...

void MainWindow::connectTcp() 
{ 
    QByteArray data; // <-- fill with data 

    _pSocket = new QTcpSocket(this); // <-- needs to be a member variable: QTcpSocket * _pSocket; 
    connect(_pSocket, SIGNAL(readyRead()), SLOT(readTcpData())); 

    _pSocket->connectToHost("127.0.0.1", 9000); 
    if(_pSocket->waitForConnected()) { 
     _pSocket->write(data); 
    } 
} 

void MainWindow::readTcpData() 
{ 
    QByteArray data = pSocket->readAll(); 
} 

Należy pamiętać jednak, że do czytania z TcpSocket można odbierać dane z więcej niż jednej transmisji, tj. kiedy serwer wyśle ​​ci ciąg "123456", możesz otrzymać "123" i "456". Twoim obowiązkiem jest sprawdzenie, czy transmisja jest kompletna. Niestety, prawie zawsze powoduje to, że twoja klasa jest stanowa: klasa musi pamiętać, jakiej transmisji oczekuje, czy rozpoczęła się już i czy jest kompletna. Do tej pory nie wymyśliłem tego w elegancki sposób.

+0

Wiele zobowiązany Robin, można podać jakiś kod do odbioru danych? –

+0

Pewnie. Odpowiednio zredagowałem swoją odpowiedź. – Robin

+0

Dziękuję, proszę pana! –

5

W moim przypadku czytałem dane XML, a czasami nie dostałbym wszystkich w jednym pakiecie. Oto eleganckie rozwiązanie. WaitForReadyRead może również mieć w nim limit czasu i , a następnie dodatkowe sprawdzanie błędów w przypadku przekroczenia limitu czasu. W moim przypadku nie powinien otrzymać niekompletny xml, ale jeśli tak się stało będzie to zablokować nić się indefinetly bez timeout:

while(!xml.atEnd()) { 

    QXmlStreamReader::TokenType t = xml.readNext(); 

    if(xml.error()) { 
     if(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError) { 
      cout << "reading extra data" << endl; 
      sock->waitForReadyRead(); 
      xml.addData(sock->readAll()); 
      cout << "extra data successful" << endl; 
      continue; 
     } else { 
      break; 
     } 
    } 
    ... 
+0

Dobra odpowiedź. wiele dzięki człowiekowi. – Taz742