使用方法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卡死等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)