2011-10-27 14 views
14

私はQTが新しくなりました。リスニングサーバに接続してデータを送信したいと思います。私は入手可能な例を見て、彼らは何を...サーバは堅牢なリスニングとされると仮定すると、最も簡単なQT TCPクライアント

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

(..などの接続、幸運、)私には非常に役立つていないようだ、余分な機能を持っているように見えます私は "データ"変数のQByteArrayを送信する必要があります。

非常に高く評価されています。

答えて

20

QTcpSocketを使用すると非常に簡単です。あなたが行ったように始まる...

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(); 
} 

がTcpSocketから読み込みを行うための複数の伝送、すなわち内のデータを受け取ることができること、しかし、注意してください。サーバーから文字列 "123456"が送信されると、 "123"と "456"が返されます。送信が完了したかどうかを確認するのはあなたの責任です。残念ながら、これはほとんどの場合、あなたのクラスはステートフルになります。クラスは、それがすでに開始されているかどうか、そして完了しているかどうかを伝える必要があります。これまでのところ、私はそれについてエレガントな方法を考え出していない。

+0

多くの義務がロビン、あなたは、データを受信するためのいくつかのコードを提供してもらえますか? –

+0

私はそれに応じて私の答えを編集しました。 – Robin

+0

ありがとうございます! –

5

私の場合はXMLデータを読んでいましたが、時には1つのパケットですべてを取得できませんでした。 ここは優雅なソリューションです。 WaitForReadyReadもタイムアウトになり、 タイムアウトに達した場合に何らかの余分なエラーをチェックします。私の場合は、 不完全なXMLを受け取ることはありませんが、それは、これはタイムアウトなしindefinetly スレッドをロックするでしょう起こった場合:

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

多くの人に感謝します。 – Taz742

関連する問題