Қарапайым QT TCP клиенті

Мен тыңдау серверіне қосылып, кейбір деректерді жібергім келеді. Мен қолда бар мысалдарды қарап шықтым, бірақ олар маған өте пайдалы емес (яғни, fortune және т.б.) қосылмайтын қосымша функциялары бар сияқты. Бұл код әлі күнге дейін бар:

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 класына жататын void MainWindow :: ішінен көре аласыз. Олар mainwindow.cpp бағдарламасында болуы керек және сізге declarewow-ды 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 алу, бірақ егер бұл орын алса, бұл жіпті үзбей бекітеді үзіліссіз:

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, көзі