QT tcp 客户端收不到数据 QTcpSocket 记录

如题所述

使用方法1 继承QT thread 重写run

void DataUnpacket::run( )

{

    m_pSocket = new QTcpSocket;

    //m_pSocket->socketOption(QAbstractSocket::LowDelayOption);

    QString ip("192.168.112.100");

    ushort portData = 5001;

    m_pSocket->connectToHost( ip, portData );

    m_pSocket->waitForConnected();

    if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功

        return;

    while( m_bRunning )

    {

        if( m_pSocket->bytesAvailable() > 0)

        {

            QByteArray arr = m_pSocket->readAll(); //这不进,

            qDebug() << "recv len =" << arr.length() ;

        }

        else

        {

            m_pSocket->write("test",4);

            m_pSocket->flush();// 可以发送出去

            QThread::usleep(1000);

        }

    }

}

方法二 movethred  效果 一样 

方法三 SocketQThread中使用  QtConcurrent::run创建线程, 这个使用QTCreater 调试没有问题,这个也是大坑

打包会出现不能接收到数据或者没发出去, wireshark检测有时会出现现象接收到数据但没发出去

int SocketQThread::InitTest( )

{

    int re = 0;

    QString ip("192.168.112.5");

    ushort portData = 5001;

    m_pDataPackage.resize(1);

    m_pDataPackage[0] = new DataUnpacket;

   if( !m_pDataPackage[0]->InitSocket(ip,portData ) )

       re = -1;

    return re;

}

void SocketQThread::stratThred()

{

    m_running = true;

    for(int i=0;i<1;i++)//测试

    {

      QtConcurrent::run(this, &SocketQThread::recvDataThread, i );

    }

}

void SocketQThread::stopThred()

{

    m_running = false;

    for(int i=0;i<1;i++)//测试

    {

      m_pDataPackage[0]->CloseFile( );

      m_pDataPackage[0]->tcpDisconnect( );

    }

}

void SocketQThread::recvDataThread( int ch )//暂定

{

    DataUnpacket* pPackage = m_pDataPackage[ch];

    while( m_running )

    {

        if( pPackage->SocketBytesAvailable() > 0)

            pPackage->RecvData();

        else

            QThread::usleep(1);

    }

}

类DataUnpacket 继承 Cpackage 如下:

m_Socket为Cpackage的成员变量

int DataUnpacket::RecvData( )

{

    int re = 0;

    QByteArray reArr;

    QByteArray arr = m_Socket.readAll();

   qDebug() << "recv len =" << arr.length() ;

    #if 0

    m_Socket.write(arr );

    m_Socket.flush();//不加发不出去

#else

    QMetaObject::invokeMethod( &m_Socket, std::bind( static_cast< qint64(QTcpSocket::*)(const QByteArray &) >( &QTcpSocket::write ),&m_Socket, arr ));//, Qt::DirectConnection

    //若加 Qt::DirectConnection ,需要添加m_Socket.flush();/

    return re;

}

bool Cpackage::InitSocket(QString& ip, ushort& port )

{

    bool tf = true;

    m_Socket.connectToHost( ip, port );

    m_Socket.waitForConnected();

    if( QAbstractSocket::ConnectedState != m_Socket.state() )//判断是否连接成功

        tf = false;

    return tf;

}

void Cpackage::tcpDisconnect( )

{

    if( m_Socket.state() == QAbstractSocket::ConnectedState)  //关闭时,确保与服务器断开连接

      m_Socket.disconnectFromHost();

}

方法四 QtConcurrent::run(this, &DataUnpacket::RecvDataTest);  这个

void testData::RecvDataTest()

{

    m_pSocket = new QTcpSocket(this);

    //m_pSocket->socketOption(QAbstractSocket::LowDelayOption);

    QString ip("192.168.112.100");

    ushort portData = 5001;

    m_pSocket->connectToHost( ip, portData );

    m_pSocket->waitForConnected();

    if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功

        return;

    while( m_bRunning )

    {

        if( m_pSocket->bytesAvailable() > 0)

        {

            QByteArray arr = m_pSocket->readAll();//这不进,

            qDebug() << "recv len =" << arr.length() ;

        }

        else

        {

            m_pSocket->write("test",4);

            m_pSocket->flush();//可以发送出去

            QThread::usleep(1000);

        }

    }

}

如下例子 是可以的

void testData::RecvDataTest()

{

    qDebug() << QThread::currentThread();

    QByteArray arr = m_pSocket->readAll();//这不进,

    qDebug() << "recv len =" << arr.length() ;

    m_pSocket->write("test",4);

}

void testData::stratThred( bool tf )

{

    if( tf )

        start();

    else

        exit();

}

void testData::run( )

{

    qDebug() << "stratThred" << QThread::currentThread();

    if( nullptr == m_pSocket )

    {

        m_pSocket = new QTcpSocket;

        connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(RecvDataTest()), Qt::DirectConnection);

        //m_pSocket->socketOption(QAbstractSocket::LowDelayOption);

    }

    m_pSocket->connectToHost( QString("192.168.112.100"), 5001 );

    m_pSocket->waitForConnected();

    if( QAbstractSocket::ConnectedState != m_pSocket->state() )//判断是否连接成功

        return;

    //m_pSocket->waitForReadyRead(1000);

    exec();

    m_pSocket->disconnectFromHost();

}
温馨提示:答案为网友推荐,仅供参考
相似回答