qt网络编程tcp客户端(qt tcp编程)
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获取和发布数据)上提供了一个抽象层,并且仅暴露了一般或高级概念的类,函数和信号。