Найпростае QT TCP кліент

Я хацеў бы падлучыцца да сервера для праслухоўвання і перадачы некаторых дадзеных. Я паглядзеў на даступных прыкладах, але яны, здаецца, маюць дадатковыя функцыі, якія не здаюцца вельмі карысна для мяне (гэта значыць злучыць, стан і г.д.). Гэта код, які я да гэтага часу:

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

Мяркуючы, што сервер праслухоўвае і надзейны, што мне трэба рэалізаваць, каб паслаць зменную дадзеных з тыпам дадзеных QByteArray ?

15

2 адказы

вельмі проста з 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». Гэта ваша адказнасць, каб праверыць, ці з'яўляецца перадача завершана. На жаль, гэта амаль заўсёды прыводзіць у сваім класе з'яўляецца станам: клас павінен памятаць, што перадача яго чакае, ці была яна ўжо пачалася, і калі ён будзе завершаны. Да гэтага часу я не зразумеў, хупавы спосаб абыйсці гэта.

22
дададзена
Вядома. Я адрэдагаваў мой адказ адпаведна.
дададзена аўтар Robin, крыніца
@adivk: Вы можаце бачыць з нікчэмнай MainWindow :: , што метады ставяцца да класа MainWindow. Як такія, яны павінны быць у mainwindow.cpp, і вы таксама павінны будзеце дадаць аб'яву ў mainwindow.h. Што тычыцца файлаў загалоўкаў, вам, верагодна, спатрэбіцца як #include і #include . Майце на ўвазе, аднак, што гэтая нітка 4,5 гадоў і вышэй код, верагодна, быў напісаны з Qt4.2. Дэталі могуць адрознівацца, калі вы карыстаецеся іншую версію Qt.
дададзена аўтар Robin, крыніца
@adivk: Здаецца, у вас ёсць нешта канкрэтнае на ўвазе, што выходзіць за рамкі гэтага пытання. Дык чаму б не апублікаваць сваё пытанне як новае пытанне? Вы можаце быць здзіўлены тым, як хутка вы атрымаеце высакаякасныя адказы! (Не адпраўляць пытанні ў выглядзе каментароў.)
дададзена аўтар Robin, крыніца
будзе гэты біт кода проста адасоблена main.cpp або mainwindow.cpp? Акрамя таго, ці ёсць якія-небудзь файлы загалоўкаў, якія павінны быць прыняты пад увагу?
дададзена аўтар walksignison, крыніца
мне трэба што-небудзь звязанае з наладжваць кліента ў файле main.cpp?
дададзена аўтар walksignison, крыніца
Премного Робін, маглі б вы даць код для прыёму дадзеных?
дададзена аўтар user990246, крыніца
Дзякуй, сэр !!
дададзена аўтар user990246, крыніца

У маім выпадку я чытаў дадзеныя XML, а часам я б не атрымаць усё ў адным пакеце. Вось элегантнае рашэнне. 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;
        }
    }
    ...
5
дададзена
добры адказ. многія дзякуюць чалавека.
дададзена аўтар Taz742, крыніца