qt网络编程tcp客户端(qt tcp编程)

http://www.itjxue.com  2023-02-09 08:53  来源:未知  点击次数: 

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;i1;i++)//测试

? ? {

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

? ? }

}

void SocketQThread::stopThred()

{

? ? m_running = false;

? ? for(int i=0;i1;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();

}

Qt Socket网络编程 服务器端提示QIODevice::read (QTcpSocket): device not open,但是与客户端连接成功

这是因为文件路径不对造成的,解决方法如下:

1、首先pro文件配置:Qt网络功能需要在pro文件增加网络库。

2、QTcpServer服务端建立的方法代码,如下图所示。

3、QTcpServer当有新客户端连接时,会发出QTcpServer::newConnection的信号方法代码。

4、客户端为主动连接方不需要监听,直接建立QTcpSocket代码。

5、最后通过connectToHost连接指定ip和端口,将socket的连接成功的信号与对应槽连接,当连接成功可以将自定义的标记位置为true。

Qt网络编程

Qt网络模块为我们提供了编写TCP / IP客户端和服务器的类。 它提供了较低级别的类,例如代表低级网络概念的QTcpSocket,QTcpServer和QUdpSocket,以及诸如QNetworkRequest,QNetworkReply和QNetworkAccessManager之类的高级类来执行使用通用协议的网络操作。 它还提供了诸如QNetworkConfiguration,QNetworkConfigurationManager和QNetworkSession等类,实现承载管理。

要使用Qt网络类需要:

#include QtNetwork

要链接到Qt网络模块需要:

QT += network

名称空间

网络类

网络访问API是用于执行常见网络操作的类的集合.API在所使用的特定操作和协议(例如,通过HTTP获取和发布数据)上提供了一个抽象层,并且仅暴露了一般或高级概念的类,函数和信号。

(责任编辑:IT教学网)

更多

推荐Access文章