19.Qt中Thread線程中創建QTcpSocket

Thread線程中創建QTcpSocket

本文承接上一篇博文,Qt線程創建,本文記錄在線程中創建socket 套接字,連接服務器進行編程.

/**********************************************************************************************
* ThreadRecvData.cpp
* 描述:本線程類主要功能實現從服務器接收數據.
* 作者:xhome
* 時間:2020/5/8
*********************************************************************************************/


#include "ThreadRecvData.h"
#include <QDebug>
#include <QtNetWork>
#include "GroundStation.h"

ThreadRecvData::ThreadRecvData(QObject *parent) :QThread(parent)
{
	mStopFlag = false;

	qDebug() << "ThreadRecvData start ok.";


}

void ThreadRecvData::run()
{
	//1.創建tcp 客戶端類, 服務器由ros2_msgmiddleware 本地搭建.端口10001
	mTcpClient = new QTcpSocket;

	connect(mTcpClient, SIGNAL(readyRead()), this, SLOT(readDataSlot()), Qt::DirectConnection);

	mTcpClient->connectToHost("127.0.0.1", 10001);

	//2.超時等待連接30s
	if (!mTcpClient->waitForConnected(30000)){
		qDebug() << __FILE__ << " , " << __FUNCTION__ << ", " << __LINE__ << " failed to connect server. -------";
		return emit errorCodeSignal(ERROR_CODE_CONNECT_SERVER_TIMEOUT);
	}
	else {
		qDebug() << "";
		qDebug() << " ThreadRecvData ---> client connect server ok. ";
	}

	//3.連接成功發送確認標誌位.
	QString client_msg_id(SOCK_MSG_TYPE::SOCK_MSG_SWARM_MSG);
//	mTcpClient->write("1", 2);

	mTcpClient->write(client_msg_id.toUtf8());
	mTcpClient->flush();

	//阻塞線程結束.
	exec();

	//while (!m_stopFlag)
	//{
	//	QThread::sleep(1);
	//	qDebug() << "ThreadRecvData +++++++++++";
	//}

}

ThreadRecvData::~ThreadRecvData()
{

}

void ThreadRecvData::stop()
{
	mStopFlag = true;
}

/**
 * 功能:從sock中讀取消息.
 * 作者:xhome
 * 時間:2020/5/8
 */
void ThreadRecvData::readDataSlot()
{
	//解析數據.
	UavSituation_t uavSituation;

	QByteArray buffer = mTcpClient->readAll();

	QString  sbuffer(buffer);

	qDebug() << "sbuffer:" << sbuffer;

	QStringList list = sbuffer.split(",");

	for (int i = 0; i < list.size(); i++) {
		qDebug() << list[i];
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章