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

QT tcp 客户端收不到数据 QTcpSocket 记录,第1张

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

void DataUnpacket::run( )

{

    m_pSocket = new QTcpSocket;

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

    QString ip("192168112100");

    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 =" << arrlength() ;

        }

        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("1921681125");

    ushort portData = 5001;

    m_pDataPackageresize(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_SocketreadAll();

   qDebug() << "recv len =" << arrlength() ;

    #if 0

    m_Socketwrite(arr );

    m_Socketflush();//不加发不出去

#else

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

    //若加 Qt::DirectConnection ,需要添加m_Socketflush();/

    return re;

}

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

{

    bool tf = true;

    m_SocketconnectToHost( ip, port );

    m_SocketwaitForConnected();

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

        tf = false;

    return tf;

}

void Cpackage::tcpDisconnect( )

{

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

      m_SocketdisconnectFromHost();

}

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

void testData::RecvDataTest()

{

    m_pSocket = new QTcpSocket(this);

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

    QString ip("192168112100");

    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 =" << arrlength() ;

        }

        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 =" << arrlength() ;

    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("192168112100"), 5001 );

    m_pSocket->waitForConnected();

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

        return;

    //m_pSocket->waitForReadyRead(1000);

    exec();

    m_pSocket->disconnectFromHost();

}

首先回答第一个问题,读和写可以有多种实现方式,用write和read只是其中一种,前面一个函数中的 clientConnection->write(block)是调用了QTcpSocket 类中的write方法来实现,如果你想不用此方法调用类中的read和write方法,就是你问的第二个问题,in和out的作用,in和out在这里将对socket中的报文收发变为数据流的形式来 *** 作,QDataStream in(tcpSocket)比如这一句是将tcpSocket这个连接的实例对象作为一个文件描述符传递给QDataStream,然后 in >> blockSize这句话实现的就是相当于read的 *** 作,就是将数据流读出来。这个 out << (quint16)(blocksize() - sizeof(quint16))是写入。实际上对诸如串口收发,读写文件,socket通信等等,用C语言来写,抽象出来都是对文件描述符进行 *** 作,都可以用write和read来做,所以,实际上,第一种方法和第二种方法是一样的,就看你选择什么样的方法了,第三个问题可参考out << (quint16)(blocksize() - sizeof(quint16))这样的方法在收到数据以后把数据发出去。

请给分。。。

QTcpSocketReadAll卡死是指QTcpSocket读取数据的过程中出现卡死的情况,这是由于QTcpSocket读取数据的过程中出现了网络故障或者网络超时等原因导致的。为了解决这个问题,可以采用以下几种方法:1检查网络状况,确保网络通畅;2检查QTcpSocket的超时时间,确保超时时间设置的合理;3检查QTcpSocket的读取缓冲区,确保缓冲区大小设置的合理;4检查QTcpSocket的读取状态,确保读取状态正确;5检查QTcpSocket的读取数据,确保读取数据的格式正确。通过以上几种方法,可以有效地解决QTcpSocketReadAll卡死的问题,从而让QTcpSocket读取数据更加顺畅。

由于通常情况下socket连接就是TCP连接,因此socket连接一旦建立,通信双方即可开始相互的发送数据内容,直到双方断开连接。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

而>

以上就是关于QT tcp 客户端收不到数据 QTcpSocket 记录全部的内容,包括:QT tcp 客户端收不到数据 QTcpSocket 记录、qt的tcp通信 服务器和客户端读写数据的问题、qtcpsocketreadall卡死等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9770120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存